例子如下:

和这个知识点相干的 tsc 编译选项:strictPropertyInitialization

strictPropertyInitialization 设置管制是否须要在构造函数中初始化类字段。

正确做法:

class GoodGreeter {  name: string;  constructor() {    this.name = "hello";  }}

请留神,该字段须要在构造函数自身中进行初始化。 TypeScript 不会剖析您从结构函数调用的办法来检测初始化,因为派生类可能会笼罩这些办法并且无奈初始化成员。

class 成员须要在构造函数里进行初始化操作。如果在构造函数里调用其余函数,而后在这些其余函数里进行字段初始化,这样也不行。

如果肯定要这样做,即您打算通过构造函数以外的形式明确初始化字段(例如,可能内部库正在为您填充类的一部分),您能够应用明确赋值断言运算符,!:

class OKGreeter {  // Not initialized, but no error  name!: string;}

如果一个 class field 设置为 readonly,这示意它只能在构造函数内被赋值。

子类构造函数的第一行语句,必须是 super() 函数调用;

什么是 TypeScript class 里的成员办法

精确定义:A function property on a class is called a method.

除了规范类型注解之外,TypeScript 不会向办法增加任何其余新内容。

须要留神的是,在 TypeScript 办法实现外部,必须用 this. 来拜访其成员变量。

下列代码里,m 办法外部,拜访的是 class 内部定义的类型为 number 的 x 变量,而不是 class 外部类型为 string 的变量。

let x: number = 0;class C {  x: string = "hello";  m() {    // This is trying to modify 'x' from line 1, not the class property    x = "world";Type 'string' is not assignable to type 'number'.Type 'string' is not assignable to type 'number'.  }}

class 的拜访其 accessors

class C {  _length = 0;  get length() {    return this._length;  }  set length(value) {    this._length = value;  }}

TypeScript 对拜访器有一些非凡的推理规定:

(1)如果get存在但没有set,则该属性主动为只读
(2)如果没有指定setter参数的类型,则依据getter的返回类型推断
(3)Getter 和 setter 必须具备雷同的成员可见性

对于 TypeScript class 继承和接口实现的一些坑

重要的是要了解implements 子句只是查看类是否能够被视为接口类型。 它基本不会扭转类的类型或其办法。 一个常见的谬误起源是假如一个implements 子句会扭转类的类型——它不会!

看这个例子:

interface Checkable {  check(name: string): boolean;}class NameChecker implements Checkable {  check(s) {    // Notice no error here    return s.toLowerCase() === "ok";  }}const a = new NameChecker();console.log(a.check('ok'));

语法错误:

起因是因为第 6 行代码里,咱们没有为 check 办法的参数 s 指明类型,因而其类型默认为 any. 这就和 interface Checkable 里定义的 check 办法的输出参数类型 string 不统一了。

解决办法:

同样,应用可选属性实现接口不会创立该属性:

interface A {  x: number;  y?: number;}class C implements A {  x = 0;}const c = new C();c.y = 10;

解决办法:

更多Jerry的原创文章,尽在:"汪子熙":