TypeScript静态类

11 浏览
0 Comments

TypeScript静态类

我想从传统的JS转到TypeScript,因为我喜欢类似于C#的语法。

我的问题是我不知道如何在TypeScript中声明静态类。

在C#中,我经常使用静态类来组织变量和方法,将它们放在一个命名类中,而无需实例化一个对象。

在原生的JS中,我通常用一个简单的JS对象来实现这个:

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

在TypeScript中,我更倾向于使用类似C#的方法,但似乎TypeScript中不存在静态类。

针对这个问题,有什么合适的解决方案吗?

0
0 Comments

TypeScript静态类的出现原因是为了在类中定义静态属性和方法。根据《TypeScript语言规范》第8.2.1节的描述,我们可以在类中定义静态属性和方法。例如,下面的代码定义了一个名为Point的类,其中包含了一个静态方法distance()和一个静态属性origin:

class Point { 
  constructor(public x: number, public y: number) { 
    throw new Error('cannot instantiate using a static class');
  } 
  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并没有提供直接定义静态类的语法。在TypeScript中,类本身就可以被看作一个包含了实例属性和方法的静态实体。因此,在TypeScript中,我们并不需要显式地定义一个静态类,而是直接在类中定义静态属性和方法即可。

需要注意的是,这段代码中的链接已经失效,因为目前没有关于TypeScript的官方规范。根据GitHub上的讨论,目前没有预期会发布一个官方的TypeScript规范。

总结起来,TypeScript的静态类并不是通过特定的语法来定义的,而是通过在类中定义静态属性和方法来实现的。这样可以在不实例化类对象的情况下访问类的属性和方法。虽然没有直接的静态类的概念,但这种方式满足了对静态类的需求。

0
0 Comments

TypeScript static classes 是 TypeScript 1.6 版本以来的一项重要特性。可以通过将类声明为abstract来创建静态类,静态类不能实例化。静态类通常用于实现单例模式,即多次调用都返回同一个类实例。通过将构造函数标记为private可以实现单例模式,但是使用abstract关键字声明静态类是更好的做法。

下面是一个示例代码:

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

在使用静态类时,将构造函数标记为private是更好的做法。这样做可以确保静态类没有实例,如果客户端尝试实例化它,将抛出异常。

静态变量的作用域与其他面向对象编程语言的作用域相同。通过使用abstract关键字,我们可以实现将类声明为静态类的副作用。在使用时,建议在代码库中添加注释,说明该类是静态类,而不是抽象类。

需要注意的是,除非将构造函数标记为private,否则仍然可以从该类派生子类并实例化它。

以上就是 TypeScript static classes 的出现原因和解决方法的内容。

0
0 Comments

TypeScript静态类的出现的原因是因为开发者想要在TypeScript中使用类似C#的静态类的概念。然而,TypeScript并不是C#,所以不能期望在TypeScript中能够完全使用C#的概念。在C#中,静态类是指不能被继承且只能包含静态方法的类。但是,在TypeScript中可以定义函数而不需要将其放在类里面。

如果你想要将函数/方法放在一个命名空间中而不是全局中,你可以考虑使用TypeScript的模块。例如:

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

这样你就可以在外部访问M.f(),但无法访问s,也无法扩展该模块。

TypeScript规范中有更多细节,请参考TypeScript的[规范文档](https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#821-instance-and-static-members)。

所以,模块可以拥有静态方法,但类不能拥有静态数据。相比于JavaScript,这并不是一种很方便的方式,因为不需要实例化即可将数据和代码封装在一起。

需要注意的是,你需要在html文件中引入.js文件。例如,对于Angular 2项目,你可能会使用System,所以你需要在引入bootstrap之前执行System.import("Folder/M")(或者是编译后的.js文件的路径)。

需要注意的是,这种用法已经被弃用了。而且tslint也不再允许在模块和命名空间中使用这种方式。可以参考[这里](https://palantir.github.io/tslint/rules/no-namespace/)。

有一个使用静态类的用例。目前,我有一个只包含静态方法的类。在项目中,我们需要为每个可以实例化的类提供一些配置。将这样的类声明为静态类不仅可以帮助我注意到它不会被实例化,还可以防止其他开发者向其添加实例成员。

那么,优选的方式是什么呢?一个只包含静态方法和/或抽象关键字的类?与模块相比,这似乎不太好。但是,是可以实现的,建议参考[这里](https://stackoverflow.com/a/13222267/5724101)。

0