我從基類擴展了一個新類別並添加了一些屬性。 如何使用給定基底類別(包括附加屬性)建立衍生類別的實例?
此程式碼可以工作,但會強制轉換類別類型,並且不是類型安全性
// Base class is imported from a package. Not editable class BaseClass { public x: number; public power() { return this.x * 2; } } export interface CustomClass extends BaseClass { value: number; } function createCustomClass(base: BaseClass, myValue: number): CustomClass { // it's not type safe to cast this variable // How to do it the right way in Typescript? const result: CustomClass = base as CustomClass; result.value = myValue; return result; }
P粉7655701152024-02-26 14:10:39
我認為使用您的方法不可能完全排除類型轉換,但是如果您使用type Guard
檢查變數result
是否有效CustomClass
(在我的實作中是isCustomClass
),那將是安全的: p>
// Base class is imported from a package. Not editable class BaseClass { public x: number; public power() { return this.x * 2; } } export interface CustomClass extends BaseClass { value: number; } function isCustomClass(classToCheck: any): classToCheck is CustomClass { return ( typeof classToCheck?.value === "number" && classToCheck instanceof BaseClass ); } function createCustomClass(base: BaseClass, myValue: number): CustomClass { const result = base; (result as CustomClass).value = myValue; if (!isCustomClass(result)) { throw new Error("Cannot create valid `CustomClass`"); } return result; }
P粉4861381962024-02-26 11:51:43
您可以使用 Object.assign ()
方法 為目標物件新增屬性。此方法傳回目標對象,以及 其在 TypeScript 函式庫中的呼叫簽名是 輸入類型的交集。
這表示你的 createCustomClass()
可以這樣實作:
function createCustomClass(base: BaseClass, myValue: number): CustomClass { return Object.assign(base, { value: myValue }); }
傳回型別為BaseClass & {value: number}
,其結構與CustomClass
相同,因此函數編譯不會出錯,且不存在需要型別斷言。
Playground 程式碼連結 p>#