【问题标题】:What does static mean in Typescript?打字稿中的静态是什么意思?
【发布时间】:2019-12-19 23:39:30
【问题描述】:

在 Typescript 文档here 中,它谈到了

类的静态端和实例端的区别

在 C# 等 OOP 语言中,static 类是无法实例化的类。这与 Typescript 中的 static 有何不同?

【问题讨论】:

标签: typescript oop


【解决方案1】:

C# 中的静态类不仅仅是抽象的。静态类意味着不能实例化,继承自,也密封,不能修改。

原生不支持 TypeScript 中的静态类,但您可以伪造它:

function Protect(target: any): void {
  Object.freeze(target);
  Object.preventExtensions(target);
}

@Protect
abstract class StaticClass {
  constructor(){
    if (new.target) {
      throw new Error("Don't extend me");
    }
  }

  public static field = "foo";

  public static foo(): number {
    return 2;
  }
}

TypeScript 仅支持静态字段,这意味着您无需创建类的实例即可访问这些字段。

如果您使用上面的声明方法,您将不得不将所有公共字段和方法都设置为静态,因为您没有任何其他方式可以访问它们。

大多数 JS/TS 开发人员会告诉你,如果你想要一个静态类,那么不要做我上面所做的,而只使用一个普通的对象:

const MyStaticClass = {
  field: "foo",
  foo: () => 2
}

Object.freeze(MyStaticClass);
Object.preventExtensions(MyStaticClass);

那篇文章讨论的内容略有不同,与 TS 中接口的工作方式有关。

接口只了解事物的公共面,没有私有或构造函数。

他们根据实例化时的内容来验证类,因此如果您需要验证构造函数,那么就像那篇文章一样,您需要创建一个工厂函数(一种方法),以便将类类型传递给它并通过代理接口验证它的构造函数(因为它只能读取实例端的公共事物)。

同样,大多数 JS/TS 开发人员会告诉您,如果您的参数需要验证,则从包含它们的对象中创建一个接口。

interface IStuff {
  a: number;
  b: string;
  c: boolean;
}

class MyClass implements IStuff {
  public a = this.params.a;
  public b = this.params.b;
  public c = this.params.c;

  constructor(private params: IStuff){}

  public getA(): number {
    return this.a;
  }

  public getB(): string {
    return this.b;
  }

  public getC(): boolean {
    return this.c;
  }
}

【讨论】:

    猜你喜欢
    • 2019-11-15
    • 2021-04-24
    • 2018-09-12
    • 2021-04-21
    • 2016-12-02
    • 2021-01-02
    • 2021-03-27
    • 2021-04-07
    相关资源
    最近更新 更多