【发布时间】:2019-12-19 23:39:30
【问题描述】:
在 Typescript 文档here 中,它谈到了
类的静态端和实例端的区别
在 C# 等 OOP 语言中,static 类是无法实例化的类。这与 Typescript 中的 static 有何不同?
【问题讨论】:
标签: typescript oop
在 Typescript 文档here 中,它谈到了
类的静态端和实例端的区别
在 C# 等 OOP 语言中,static 类是无法实例化的类。这与 Typescript 中的 static 有何不同?
【问题讨论】:
标签: typescript oop
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;
}
}
【讨论】: