Answers:
TypeScript不是C#,因此您不必期望TypeScript中的C#概念相同。问题是为什么您要使用静态类?
在C#中,静态类只是不能被子类化的类,只能包含静态方法。C#不允许在类之外定义函数。但是,在TypeScript中这是可能的。
如果您正在寻找一种将函数/方法放在命名空间(即非全局)中的方法,则可以考虑使用TypeScript的模块,例如
module M {
var s = "hello";
export function f() {
return s;
}
}
因此,您可以从外部访问Mf(),但不能访问s,并且不能扩展模块。
有关更多详细信息,请参见TypeScript 规范。
.js
你html
。因此,对于Angular 2
你可能使用System
... so'd做System.import("Folder/M");
(或任何路径是编译的.js
文件)的前bootstrap import
自TypeScript 1.6以来,抽象类一直是TypeScript的一等公民。您不能实例化一个抽象类。
这是一个例子:
export abstract class MyClass {
public static myProp = "Hello";
public static doSomething(): string {
return "World";
}
}
const okay = MyClass.doSomething();
//const errors = new MyClass(); // Error
Singleton
用于同一类实例的共享内存模式。另外,静态类没有定义的实例,因此,如果客户端尝试对其进行初始化,则必须抛出异常。
abstract
TypeScript支持该关键字。
abstract
!@KimchiMan-好主意!
在Typescript语言规范的 8.2.1中描述了定义类的静态属性和方法的方法:
class Point {
constructor(public x: number, public y: number) { }
public distance(p: Point) {
var dx = this.x - p.x;
var dy = this.y - p.y;
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中仍然不存在,但是您可以使用私有构造函数编写一个行为类似,但开销很小的类,以防止从外部实例化类。
class MyStaticClass {
public static readonly property: number = 42;
public static myMethod(): void { /* ... */ }
private constructor() { /* noop */ }
}
该代码片段将允许您使用类似于C#对应对象的“静态”类,唯一的缺点是仍然可以从内部实例化它们。幸运的是,尽管您无法使用私有构造函数扩展类。
这是一种方法:
class SomeClass {
private static myStaticVariable = "whatever";
private static __static_ctor = (() => { /* do static constructor stuff :) */ })();
}
__static_ctor
这是一个立即调用的函数表达式。Typescript将输出代码以在生成的类的末尾调用它。
更新:对于静态构造函数中不再允许静态成员引用的泛型类型,您现在需要一个额外的步骤:
class SomeClass<T> {
static myStaticVariable = "whatever";
private ___static_ctor = (() => { var someClass:SomeClass<T> ; /* do static constructor stuff :) */ })();
private static __static_ctor = SomeClass.prototype.___static_ctor();
}
当然,无论如何,您都可以在类之后调用通用类型的静态构造函数,例如:
class SomeClass<T> {
static myStaticVariable = "whatever";
private __static_ctor = (() => { var example: SomeClass<T>; /* do static constructor stuff :) */ })();
}
SomeClass.prototype.__static_ctor();
只要记住不要this
在__static_ctor
上面(显然)使用。
class SomeClass {}
生成一个构造函数-几乎没有什么值得评论的,就好像引入了新问题一样。;)仅供参考:JS中没有真正的“构造函数”,只有在对象或通过调用时具有“ this”的函数new
。无论对于任何“阶级”,这都是存在的。
今天(31/07/2018),我得到了相同的用例,发现这是一种解决方法。它基于我的研究,对我有用。 期望 -在TypeScript中实现以下目标:
var myStaticClass = {
property: 10,
method: function(){}
}
我这样做:
//MyStaticMembers.ts
namespace MyStaticMembers {
class MyStaticClass {
static property: number = 10;
static myMethod() {...}
}
export function Property(): number {
return MyStaticClass.property;
}
export function Method(): void {
return MyStaticClass.myMethod();
}
}
因此,我们将按以下方式使用它:
//app.ts
/// <reference path="MyStaticMembers.ts" />
console.log(MyStaticMembers.Property);
MyStaticMembers.Method();
这对我有用。如果有人有其他更好的建议,请让我们所有人听听!谢谢...
之所以存在诸如C#之类的静态类,是因为没有其他顶级结构可以对数据和函数进行分组。但是,在JavaScript中,它们确实如此,因此像您一样声明一个对象更加自然。要更紧密地模仿类语法,可以声明如下方法:
const myStaticClass = {
property: 10,
method() {
}
}
参见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);
实现此目的的一种可能方法是在另一个类中包含一个类的静态实例。例如:
class SystemParams
{
pageWidth: number = 8270;
pageHeight: number = 11690;
}
class DocLevelParams
{
totalPages: number = 0;
}
class Wrapper
{
static System: SystemParams = new SystemParams();
static DocLevel: DocLevelParams = new DocLevelParams();
}
然后,可以使用包装器访问参数,而不必声明其实例。例如:
Wrapper.System.pageWidth = 1234;
Wrapper.DocLevel.totalPages = 10;
因此,您可以获得JavaScript类型对象的好处(如原始问题中所述),但具有能够添加TypeScript类型的好处。此外,它避免了必须在类中所有参数之前添加“ static”。
我正在寻找类似的东西,然后遇到了一个叫做 Singleton Pattern
。
参考:单例模式
我正在研究BulkLoader类,以加载不同类型的文件,并希望为其使用Singleton模式。这样,我可以从主应用程序类加载文件,并轻松地从其他类检索加载的文件。
以下是一个简单示例,说明如何使用TypeScript和Singleton模式为游戏制作得分管理器。
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() );
您还可以使用关键字namespace
来组织变量,类,方法等。见文件
namespace Validation {
export interface StringValidator {
isAcceptable(s: string): boolean;
}
const lettersRegexp = /^[A-Za-z]+$/;
const numberRegexp = /^[0-9]+$/;
export class LettersOnlyValidator implements StringValidator {
isAcceptable(s: string) {
return lettersRegexp.test(s);
}
}
export class ZipCodeValidator implements StringValidator {
isAcceptable(s: string) {
return s.length === 5 && numberRegexp.test(s);
}
}
}