TypeScript class 的静态成员变量

简介: TypeScript class 的静态成员变量

Static Members

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

class MyClass {

 static x = 0;

 static printX() {

   console.log(MyClass.x);

 }

}

console.log(MyClass.x);

MyClass.printX();

Special Static Names

有一些特殊的名称,不能用于 TypeScript class 的静态成员变量定义。


从 Function 原型中覆盖属性通常是不安全/不可能的。 因为类本身就是可以用 new 调用的函数,所以不能使用某些静态名称。 名称、长度和调用等函数属性不能定义为静态成员:

image.png

请记住,类型总是被完全擦除! 在运行时,只有一个 Box.defaultValue 属性槽。 这意味着设置 Box.defaultValue (如果可能的话)也会改变 Box.defaultValue - 不好。 泛型类的静态成员永远不能引用类的类型参数。


this at Runtime in Classes

重要的是要记住 TypeScript 不会改变 JavaScript 的运行时行为,而且 JavaScript 以具有一些特殊的运行时行为而闻名。


JavaScript 对此的处理确实不同寻常:

class MyClass {

 name = "MyClass";

 getName() {

   return this.name;

 }

}

const c = new MyClass();

const obj = {

 name: "obj",

 getName: c.getName,

};

// Prints "obj", not "MyClass"

console.log(obj.getName());

长话短说,默认情况下,函数内 this 的值取决于函数的调用方式。 在这个例子中,因为函数是通过 obj 引用调用的,所以它的 this 值是 obj 而不是类实例。


这很少是你想要发生的! TypeScript 提供了一些方法来减轻或防止这种错误。


方法1 - 使用箭头函数

如果您有一个经常以丢失 this 上下文的方式调用的函数,则使用箭头函数属性而不是方法定义是有意义的:

class MyClass {

 name = "MyClass";

 getName = () => {

   return this.name;

 };

}

const c = new MyClass();

const g = c.getName;

// Prints "MyClass" instead of crashing

console.log(g());

这有一些权衡:

  • 即使对于未使用 TypeScript 检查的代码,此值也保证在运行时是正确的
  • 这将使用更多内存,因为每个类实例都有自己的以这种方式定义的每个函数的副本
  • 不能在派生类中使用 super.getName,因为原型链中没有条目可以从中获取基类方法
相关文章
|
2月前
|
JavaScript 前端开发 Java
TypeScript 接口之class接口定义
TypeScript 接口之class接口定义
51 2
|
27天前
|
JavaScript 前端开发 开发者
10.【TypeScript 教程】类(Class)
10.【TypeScript 教程】类(Class)
11 2
|
25天前
|
JavaScript
typescript块级作用域变量
typescript块级作用域变量
|
2月前
|
JavaScript 前端开发 编译器
TypeScript 中的变量声明:变量声明的语法、变量的作用域、变量的类型推断和类型断言
TypeScript 中的变量声明:变量声明的语法、变量的作用域、变量的类型推断和类型断言
46 1
|
2月前
|
JavaScript
【TypeScript】一直提示 :无法重新声明块范围变量
【TypeScript】一直提示 :无法重新声明块范围变量
【TypeScript】一直提示 :无法重新声明块范围变量
|
11月前
|
JavaScript 前端开发 程序员
TypeScript--类(class)
TypeScript--类(class)
|
11月前
|
JavaScript
TypeScript 类(class)与修饰符的详细使用
TypeScript 类(class)与修饰符的详细使用
93 0
|
11月前
|
JavaScript
【typescript入门手册】class 类
【typescript入门手册】class 类
|
12月前
|
JavaScript 编译器
面试题-TS(二):如何定义 TypeScript 中的变量和函数类型?
在TypeScript中,我们可以使用冒号(:)来指定变量的类型。以下是一些常见的变量类型:
|
JavaScript Java 开发者
ts(typescript) 类(class)初探
当大家看到typescript(ts) 中的类(class)时候,可能好多人都会想起面向对象,对的,面向对象是许多后台的一种编程思想,比如: 本人曾经接触的java, 里面就是用的是面向对象的思想。但是本文不讨论面向对象,值讨论ts 中 class 新增的语法,和一些使用方法以及注意事项。
ts(typescript) 类(class)初探