Skip to content

静态成员

类可以有静态成员。这些成员并不与类的特定实例相关联。它们可以通过类的构造函数对象本身来访问。

typescript
class MyClass { 
  static x = 0; 
  static printX() { 
    console.log(MyClass.x); 
  } 
}
console.log(MyClass.x); 
MyClass.printX();

静态成员也可以使用相同的 public 、 protected 和 private 可见性修饰符。

typescript
class MyClass { 
  private static x = 0; 
}
console.log(MyClass.x);

静态成员也会被继承。

typescript
class Base { 
  static getGreeting() { 
    return "Hello world"; 
  } 
}
class Derived extends Base { 
  myGreeting = Derived.getGreeting(); 
}

特殊静态名称

一般来说,从函数原型覆盖属性是不安全的/不可能的。因为类本身就是可以用 new 调用的函数,所以某 些静态名称不能使用。像 name 、 length 和 call 这样的函数属性,定义为静态成员是无效的。

typescript
class S { 
  static name = "S!"; 
}

为什么没有静态类?

TypeScript(和JavaScript)没有像C#和Java那样有一个叫做静态类的结构。

这些结构体的存在,只是因为这些语言强制所有的数据和函数都在一个类里面;因为这个限制在 TypeScript中不存在,所以不需要它们。一个只有一个实例的类,在JavaScript/TypeScript中通常只是表示为一个普通的对象。

例如,我们不需要TypeScript中的 "静态类 "语法,因为一个普通的对象(甚至是顶级函数)也可以完成这个工作。

typescript
// 不需要 "static" class 
class MyStaticClass { 
  static doSomething() {} 
}

// 首选 (备选 1) 
function doSomething() {} 

// 首选 (备选 2) 
const MyHelperObject = { 
  dosomething() {}, 
};