TypeScript 里的 class field
例子如下:
和這個(gè)知識(shí)點(diǎn)相關(guān)的 tsc 編譯選項(xiàng):strictPropertyInitialization
strictPropertyInitialization 設(shè)置控制是否需要在構(gòu)造函數(shù)中初始化類字段。
正確做法:
class GoodGreeter {name: string;constructor() {this.name = "hello";} }請(qǐng)注意,該字段需要在構(gòu)造函數(shù)本身中進(jìn)行初始化。 TypeScript 不會(huì)分析您從構(gòu)造函數(shù)調(diào)用的方法來檢測(cè)初始化,因?yàn)榕缮惪赡軙?huì)覆蓋這些方法并且無法初始化成員。
class 成員需要在構(gòu)造函數(shù)里進(jìn)行初始化操作。如果在構(gòu)造函數(shù)里調(diào)用其他函數(shù),然后在這些其他函數(shù)里進(jìn)行字段初始化,這樣也不行。
如果一定要這樣做,即您打算通過構(gòu)造函數(shù)以外的方式明確初始化字段(例如,可能外部庫正在為您填充類的一部分),您可以使用明確賦值斷言運(yùn)算符,!:
class OKGreeter {// Not initialized, but no errorname!: string; }如果一個(gè) class field 設(shè)置為 readonly,這表示它只能在構(gòu)造函數(shù)內(nèi)被賦值。
子類構(gòu)造函數(shù)的第一行語句,必須是 super() 函數(shù)調(diào)用;
什么是 TypeScript class 里的成員方法
準(zhǔn)確定義:A function property on a class is called a method.
除了標(biāo)準(zhǔn)類型注解之外,TypeScript 不會(huì)向方法添加任何其他新內(nèi)容。
需要注意的是,在 TypeScript 方法實(shí)現(xiàn)內(nèi)部,必須用 this. 來訪問其成員變量。
下列代碼里,m 方法內(nèi)部,訪問的是 class 外部定義的類型為 number 的 x 變量,而不是 class 內(nèi)部類型為 string 的變量。
let x: number = 0;class C {x: string = "hello";m() {// This is trying to modify 'x' from line 1, not the class propertyx = "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 對(duì)訪問器有一些特殊的推理規(guī)則:
(1)如果get存在但沒有set,則該屬性自動(dòng)為只讀
(2)如果沒有指定setter參數(shù)的類型,則根據(jù)getter的返回類型推斷
(3)Getter 和 setter 必須具有相同的成員可見性
關(guān)于 TypeScript class 繼承和接口實(shí)現(xiàn)的一些坑
重要的是要理解implements 子句只是檢查類是否可以被視為接口類型。 它根本不會(huì)改變類的類型或其方法。 一個(gè)常見的錯(cuò)誤來源是假設(shè)一個(gè)implements 子句會(huì)改變類的類型——它不會(huì)!
看這個(gè)例子:
interface Checkable {check(name: string): boolean; }class NameChecker implements Checkable {check(s) {// Notice no error herereturn s.toLowerCase() === "ok";} }const a = new NameChecker();console.log(a.check('ok'));語法錯(cuò)誤:
原因是因?yàn)榈?6 行代碼里,我們沒有為 check 方法的參數(shù) s 指明類型,因此其類型默認(rèn)為 any. 這就和 interface Checkable 里定義的 check 方法的輸入?yún)?shù)類型 string 不一致了。
解決辦法:
同樣,使用可選屬性實(shí)現(xiàn)接口不會(huì)創(chuàng)建該屬性:
interface A {x: number;y?: number; } class C implements A {x = 0; } const c = new C(); c.y = 10;解決辦法:
更多Jerry的原創(chuàng)文章,盡在:“汪子熙”:
總結(jié)
以上是生活随笔為你收集整理的TypeScript 里的 class field的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oppoa9和荣耀8x对比
- 下一篇: TypeScript class 构造函