在TypeScript中,函数使用静态修饰符有什么好处吗?

11

我最近开始使用TypeScript,我的IDE WebStorm提示我可以使用静态修饰符...

export default class MyClass {
    public bar(): any {
        // do sth. with instance values
    }

    private foo(a: any, b: any): any {
        // do sth. without instance values, like checking
    }
}

这里我会收到一个警告,提醒我可以将 foo(a, b) 声明为 static。目前我关闭了这个 "警告",因为我主要认为过度使用 static 是 "代码异味",但我也不是 TypeScript 的专家。

除了其根据定义执行的操作之外,是否有任何重要的使用静态修饰符的 "附带优势"?


6
对于我来说,当一个人定义实例方法却不依赖于实例状态(且以后也不会依赖)时,代码看起来就像有异味。 - Alex
3个回答

9

正如你所提到的,使用static修饰符的主要好处是使类成员可以在不实例化类的情况下访问。

在TypeScript中使用static修饰符的一个值得注意的“副作用”是,您将无法从类实例中访问该成员。

class Hamburger {
     static beef_percentage: number = 75;
     public tasty: boolean = false;
}

console.log(Hamburger.beef_percentage); // 75
console.log(Hamburger.tasty); // Error

var myHamburger = new Hamburger();
console.log(myHamburger.beef_percentage); // Error
console.log(myHamburger.tasty); // false

我认为在某些情况下,这可能会有所帮助。

如果一个方法没有访问它的实例成员,为了使你的类的目的更加清晰,建议将该方法设置为静态方法。


1
应该将 console.log(myHamburger.beefy); // Error 改为 console.log(myHamburger.beef_percentage); // Error? - Ben Taliadoros

1
根据你的实现方式,但通过从原型中删除项目(并且不通过原型链引用它),查找通常会更快,但最终取决于引擎,并且我想这基本上是可以忽略不计的。

0
如果你的方法foo不依赖于instance属性,更像是一个utility方法,那么没有把它添加到每个instance中的必要性,最好将其放在class级别的一个位置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接