TypeScript静态类

我想从传统的JS转向TypeScript,因为我喜欢类似C#的语法。 我的问题是,我无法find如何在TypeScript中声明静态类。

在C#中,我经常使用静态类来组织variables和方法,把它们放在一个命名的类中,而不需要安装一个对象。 在香草JS中,我曾经用一个简单的JS对象来做到这一点:

var myStaticClass = { property: 10, method: function(){} } 

在TypeScript中,我宁愿去使用C-sharpy方法,但似乎静态类在TS中不存在。 什么是适合这个问题的解决scheme?

TypeScript不是C#,所以你不应该期望在TypeScript中的C#的相同的概念。 问题是为什么你想要静态类?

在C#中,静态类只是一个不能被子类化的类,只能包含静态方法。 C#不允许在类之外定义函数。 在TypeScript中,这是可能的,但是。

如果你正在寻找一种方法来把你的函数/方法放在一个名字空间(也就是不是全局的)中,你可以考虑使用TypeScript的模块,例如

 module M { var s = "hello"; export function f() { return s; } } 

所以你可以从外部访问Mf(),但不能访问,而且你不能扩展模块。

有关更多详细信息,请参阅TypeScript 规范 。

在Typescript语言规范 8.2.1中描述了定义类的静态属性和方法:

 class Point { constructor(public x: number, public y: number) { } public distance(p: Point) { var dx = this.x - px; var dy = this.y - py; return Math.sqrt(dx * dx + dy * dy); } static origin = new Point(0, 0); static distance(p1: Point, p2: Point) { return p1.distance(p2); } } 

Point.distance()是一个静态(或“类”)方法。

要在TypeScript中创build一个静态的类,你可以把所有的属性和方法都标记为静态的,有些人已经提到过了,但是除此之外,还可以确保类的新实例抛出exception,以防止创build实例。 这基本上迫使类只能以静态方式使用,尽pipe错误是运行时,而不是编译时。

 export abstract class MyClass { public static myProp = "Hello"; public static doSomething(): string { return "World"; } } const x = MyClass.doSomething(); //const example = new MyClass(); // Error 

这是一个方法:

 class SomeClass { private static myStaticVariable = "whatever"; private static __static_ctor = (() => { /* do static constructor stuff :) */ })(); } 

__static_ctor这里是一个立即调用的函数expression式。 Typescript将输出代码在生成的类的最后调用它。

更新:对于不再允许被静态成员引用的静态构造函数中的genericstypes,现在需要一个额外的步骤:

 class SomeClass<T> { static myStaticVariable = "whatever"; private ___static_ctor = (() => { var someClass:SomeClass<T> ; /* do static constructor stuff :) */ })(); private static __static_ctor = SomeClass.prototype.___ctor(); } 

当然,无论如何,你可以在类之后调用通用types静态构造函数,比如:

 class SomeClass<T> { static myStaticVariable = "whatever"; private __static_ctor = (() => { var example: SomeClass<T>; /* do static constructor stuff :) */ })(); } SomeClass.prototype.__static_ctor(); 

只要记住永远不要在__static_ctor上面(显然)使用this

我正在寻找类似的东西,并且出现了一个叫做Singleton Pattern东西。

参考: 单例模式

我正在使用BulkLoader类来加载不同types的文件,并希望使用Singleton模式。 这样,我可以从我的主要应用程序类加载文件,并轻松地从其他类检索加载的文件。

下面是一个简单的例子,您可以如何使用TypeScript和Singleton模式为游戏制作评分pipe理器。

class SingletonClass {

 private static _instance:SingletonClass = new SingletonClass(); private _score:number = 0; constructor() { if(SingletonClass._instance){ throw new Error("Error: Instantiation failed: Use SingletonDemo.getInstance() instead of new."); } SingletonClass._instance = this; } public static getInstance():SingletonClass { return SingletonClass._instance; } public setScore(value:number):void { this._score = value; } public getScore():number { return this._score; } public addPoints(value:number):void { this._score += value; } public removePoints(value:number):void { this._score -= value; } } 

然后,在其他类中的任何地方,您都可以通过以下方式访问Singleton:

 var scoreManager = SingletonClass.getInstance(); scoreManager.setScore(10); scoreManager.addPoints(1); scoreManager.removePoints(2); console.log( scoreManager.getScore() ); 

请参阅http://www.basarat.com/2013/04/typescript-static-constructors-for.html

这是一种“伪造”静态构造函数的方法。 这不是没有危险 – 请参阅参考codeplex项目 。

 class Test { static foo = "orig"; // Non void static function static stat() { console.log("Do any static construction here"); foo = "static initialized"; // Required to make function non void return null; } // Static variable assignment static statrun = Test.stat(); } // Static construction will have been done: console.log(Test.foo); 

像C#这样的语言中的静态类是存在的,因为没有其他顶级的构造来分组数据和函数。 然而,在JavaScript中,它们是这样做的,所以声明一个像你这样的对象就更自然了。 为了更接近地模仿类的语法,你可以像这样声明方法:

 const myStaticClass = { property: 10, method() { } }