TypeScript 里的 class field
例子如下:
和這個知識點相關的 tsc 編譯選項:strictPropertyInitialization
strictPropertyInitialization 設置控制是否需要在構造函數中初始化類字段。
正確做法:
class GoodGreeter {name: string;constructor() {this.name = "hello";} }請注意,該字段需要在構造函數本身中進行初始化。 TypeScript 不會分析您從構造函數調用的方法來檢測初始化,因為派生類可能會覆蓋這些方法并且無法初始化成員。
class 成員需要在構造函數里進行初始化操作。如果在構造函數里調用其他函數,然后在這些其他函數里進行字段初始化,這樣也不行。
如果一定要這樣做,即您打算通過構造函數以外的方式明確初始化字段(例如,可能外部庫正在為您填充類的一部分),您可以使用明確賦值斷言運算符,!:
class OKGreeter {// Not initialized, but no errorname!: 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 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 對訪問器有一些特殊的推理規則:
(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 herereturn 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的原創文章,盡在:“汪子熙”:
總結
以上是生活随笔為你收集整理的TypeScript 里的 class field的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oppoa9和荣耀8x对比
- 下一篇: TypeScript class 构造函