簡體   English   中英

Typescript 聲明方法的參數是抽象類型 Class 並執行 Static 方法

[英]Typescript Declare Parameter of Method is Type of Abstract Class and Execute Static Method

我遇到了一個有趣的問題。 我有一個抽象的 class 和一個 static 方法,我希望擴展多個其他類。

我想將所有這些未實例化的類作為數組提供給另一個 class 中的方法。 如果從 class static 方法返回的值為 false,則此其他類方法將實例化它們。

這是一些示例代碼來說明我的問題:

abstract class Abstract {
  public static defer() {
    return true;
  }
}

class MyClass extends Abstract {}

class OtherClass {
  public add(my_classes: Array<new () => Abstract>) {
    const x = my_classes[0].defer();
    const y = new my_classes[0]();
  }
}

const other_class = new OtherClass();
other_class.add([MyClass]);

就行const x = my_classes[0].defer(); 我收到以下錯誤:

類型“new () => Abstract”.ts(2339) 上不存在屬性“defer”

如果我將 my_classes 參數切換為Array<typeof Abstract>的類型,我在嘗試實例化它時會收到以下錯誤:

無法創建抽象 class 的實例。(2511)

在這種情況下,我如何調用 static 方法並且還能夠創建 class 的新實例?

new () => Abstract類型僅表示 function,它可以充當Abstract class 的構造函數。 它不捕獲Abstract的 static 成員,因為理論上您可以創建其他遵循new () => Abstract但不包括任何 static 成員的類。

在 typescript 中,您可以使用typeof Abstract訪問 static 成員。 因此,更改add方法的定義以包括構造函數簽名和 static 方法:

public add(my_classes: Array<typeof Abstract & (new () => Abstract)>) { ... }

哪個應該糾正你的錯誤。

請注意,在 typescript 中,class 的實例類型與 class 名稱相同。 在您的示例中, Abstract class 的實例將具有Abstract類型。 您可以通過前綴typeof來訪問 class 的 static 端。


游樂場鏈接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM