【问题标题】:Typescript - Difference in class with static members vs namespace with const membersTypescript - 具有静态成员的类与具有 const 成员的命名空间的区别
【发布时间】:2019-09-11 07:05:05
【问题描述】:

如果我要在 Typescript 中创建以下命名空间和类,两者之间会有什么区别?两者的内存管理有区别吗?

export namespace TestNamespace {
  export const Test = 'TEST';
  export const TestFunction = (value:string):boolean => {
      return !value || value.length === 0;
  }
}

export class TestClass {
    static Test = 'TEST';
    static TestFunction(value:string): boolean {
        return !value || value.length === 0;
    }
}

它们都可以用相同的方式调用:

console.log(TestClass.Test);
console.log(TestClass.TestFunction('Test'));

console.log(TestNamespace.Test);
console.log(TestNamespace.TestFunction('Test'));

唯一的区别仅仅是书写方式的偏好吗?

【问题讨论】:

  • 这一切都取决于目的。类和命名空间之间存在一些差异,您可以在 Web 上轻松找到它们。在您的示例中没有区别。因此,这不是对代码编写方式的偏好,而是取决于您在特定场景中需要使用什么。

标签: javascript typescript memory


【解决方案1】:

有一些差异,但它们可能并不特别重要:

  • 它们最明显的区别是TestClass是构造函数,TestNamespace是非函数对象。您可以调用构造函数。你不能调用一个对象。 (您可以通过将其设为 abstract 来最小化这种差异,因此 TypeScript 编译器将不允许 new TestClass。)

  • 如果您的目标是 ES2015+,class 语法将在编译后的 JavaScript 中保持class 语法。 (如果你的目标是 ES5 或更早版本,它会被编译成一个函数。)

不应该有任何显着的内存管理差异。

【讨论】:

  • 只有静态成员的抽象类仍然是作业的错误工具...
  • @JonasWilms 我不反对。在像 Java 这样的 OO 语言中,您偶尔会得到一个“实用程序类”,它只有静态方法并且不允许实例化(私有构造函数或抽象类),但在这些情况下,它是围绕这样一个事实而产生的,即您不能只拥有免费的浮动功能。更好的 OO 设计是拥有一个可以生成实例的实用程序类,然后您可以从中使用实用程序方法。 DI 将是我的首选,以确保您不会在实例中乱扔内存,但 Singleton 可以工作。仍然在 JS 中,如果你不需要类,你应该使用函数。
【解决方案2】:

TestClass 是一个类,因此您可以从中创建实例。好像不需要,所以使用命名空间。

两者的内存管理有区别吗?

不是真的,两者都会创建一个永远存在的对象。

【讨论】:

    猜你喜欢
    • 2018-04-16
    • 1970-01-01
    • 2012-05-27
    • 2010-10-17
    • 2012-12-15
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    相关资源
    最近更新 更多