網站搜尋

knockout.js - 在 Typescript 中擴展通用參數


我想創建一個工具函數,通過向數組中的每個項目添加一個 isChecked 的 Knockout 可觀察屬性來生成檢查清單。這個函數應該是這樣的:

createCheckList<T>(allEntities: T[], selected: T[]) : CheckListItem<T> {
    ...
}

我正在返回一個 CheckListItem<T>,因為這個介面應該擴展 T 以添加 isChecked 屬性。然而,TypeScript 不允許我這麼做:

interface CheckListItem<T> extends T {
    isChecked: KnockoutObservable<boolean>;
}

給我錯誤訊息:

一個介面只能擴展另一個類別或介面。

有辦法做到這個嗎?

答案#1

自從 TypeScript 1.6 以來,你可以使用交叉類型:

type CheckListItem<T> = T & {
  isChecked: KnockoutObservable<boolean>;
};

答案#2

在 TypeScript 中沒有方法可以表達這個。

你當然可以改成這樣做:

interface CheckListItem<T> {
    isChecked: KnockoutObservable<boolean>;
    item: T;
}

這樣做的優點是當物件本身具有 isChecked 屬性時,不會破壞該物件。