在 Typescript 中覆寫 Array.of() 用於擴展 Array 的自訂 2D 陣列類別
我正在嘗試擴展 Array 並製作一個 Array2D 類別。我希望建構函數可以接受任意數量的參數,但這些參數應該是類型 T 的陣列。以下是我目前的進展:
class Array2D<T> extends Array<T[]> {
constructor(...args: T[][]) {
super(...args)
}
static of(...args: T[][]) {
return new Array2D(...args)
}
}
Typescript 顯示此錯誤:
Types of property 'of' are incompatible.
Type '<T>(...args: T[][]) => Array2D<T>' is not assignable to type '<T>(...items: T[]) => T[]'.
Types of parameters 'args' and 'items' are incompatible.
Type 'T' is not assignable to type 'T[]'.
有人可以解釋一下 TypeScript 在抱怨什麼以及如何解決這個問題嗎?
答案#1
這裡有另一個打字變通方法。讓我們將 Array 建構函數的類型擴展為沒有已知靜態方法的類型:
const VanillaArrayConstructor: new <T>(...args: T[]) => Array<T>
= Array;
你可以使用 VanillaArrayConstructor 來構造陣列,但如果你嘗試調用 .from() 或 .of() 或任何其他靜態方法,編譯器會報錯。然後你可以繼承 那個 而不是 Array:
class Array2D<T> extends VanillaArrayConstructor<T[]> {
constructor(...args: T[][]) {
super(...args)
}
static of<T>(...args: T[][]) {
return new Array2D(...args)
}
}
這對 Array2D 在執行時的實際行為沒有任何影響,但現在的類型是這樣的:編譯器不再期望 Array2D 建構函數的類型會延伸 Array 建構函數的類型。
希望這對你有幫助。祝你好運!
程式碼連結
