例子如下:
和这个知识点相干的 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的原创文章,尽在:"汪子熙":