【问题标题】:Typescript: static method vs function defined outside class打字稿:静态方法与在类外定义的函数
【发布时间】:2020-08-13 20:44:53
【问题描述】:

在 TypeScript 中,静态类方法与在类外部(文件顶部)定义的函数之间有什么实际区别?

我知道与其他类和文件的可见性存在差异。当可见性不是问题时(函数/方法只在一个类中使用),我们什么时候应该使用静态方法而不是在任何类之外定义的函数。

例子:

export class Foo {
  
  constructor(bar: string) {
    Foo.shout(bar);
  }

  private static shout(content: string) {
    console.log(string.toUpperCase());
  }
}

VS

export class Foo {
  
  constructor(bar: string) {
    shout(bar);
  }

}

function shout(content: string) {
  console.log(string.toUpperCase());
}

【问题讨论】:

  • 除了技术差异之外,您还应该考虑架构差异:方法实际上与类有什么关系吗?它属于那里吗?
  • 在许多语言中,静态方法只是一个具有时髦名称的全局函数,通常具有更好的访问控制。
  • @axiac - 是的,对于 C++ 和其他几个可能都是如此。这不适用于 JavaScript 或 TypeScript。

标签: typescript


【解决方案1】:

在 TypeScript 中,静态类方法与在类外部(文件顶部)定义的函数之间有什么实际区别?

没有那么多:

  1. 使用静态方法的代码必须可以访问该类;使用独立函数的代码必须能够访问独立函数。

  2. 使用静态方法在技术上涉及到类的构造函数的属性查找;使用独立功能不会。在实践中,这将被优化以使其无关紧要。

  3. 静态方法中的代码将可以通过super 访问构造函数的父构造函数(这对于JavaScript 来说是相当独特的);独立函数中的代码不会(因为没有父构造函数)。

  4. 特别是关于您的示例:您的独立 shout 函数对于它出现的模块是私有的; Foo 上的静态方法可从导入 Foo 的其他模块访问。

稍微接近舆论领域:

  1. 一个独立的函数是独立的,它没有为阅读代码的人提供关于它是什么或它在哪里定义的太多上下文。静态方法通过类名提供更多上下文。 但是,如果您使用的是模块(看起来是这样),import 为独立功能提供了一些上下文。

...我们什么时候应该使用静态方法而不是在任何类之外定义的函数。

这在很大程度上是一个观点和风格的问题,因此对于 Stack Overflow 来说是题外话。如果您的团队认为需要使用某些规则来保持一致性,请同意一套规则并保持一致。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-11
    相关资源
    最近更新 更多