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 調用的函數,所以不能使用某些靜態名稱。 名稱、長度和調用等函數屬性不能定義為靜態成員:
class S {static name = "S!"; Static property 'name' conflicts with built-in property 'Function.name' of constructor function 'S'. }Generic Classes
類,很像接口,可以是通用的。 當使用 new 實例化泛型類時,其類型參數的推斷方式與函數調用中的推斷方式相同:
class Box<Type> {contents: Type;constructor(value: Type) {this.contents = value;} }const b = new Box("hello!");const b: Box<string>Type Parameters in Static Members
下列代碼會出現語法錯誤:
class Box<Type> {static defaultValue: Type; Static members cannot reference class type parameters. }請記住,類型總是被完全擦除! 在運行時,只有一個 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,因為原型鏈中沒有條目可以從中獲取基類方法
總結
以上是生活随笔為你收集整理的TypeScript class 的静态成员变量的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SAP Spartacus Defini
- 下一篇: 灵魂鹿怎么抓(灵魂真的存在)