網站搜尋

在 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 建構函數的類型。

希望這對你有幫助。祝你好運!

程式碼連結