[英]Typescript Extend Generic Interface
我想創建一個接口,我可以通過它擴展任何打字稿類型來添加一個屬性來擴展泛型類型。 例如,創建一個如下所示的Confidence<any>
類型:
export interface Confidence<T> extends T{
confidenceLevel:number
}
然后可以通過以下方式訪問它:
const date:Confidence<Date> = new Date();
date.confidenceLevel = .9;
這似乎不可能(我覺得它是反模式的),但是我可以做到
export type Confidence<T> = T & {
confidenceLevel:number
}
這似乎完成了我想做的事情,盡管我覺得我在作弊。
我認識到如果我覆蓋泛型類型的屬性,這種“反向擴展”可能會出現問題,但這是唯一的問題嗎? 我無法解決這個問題,創建僅添加屬性的類型的最佳方法是什么?
有一個長期存在的功能請求microsoft/TypeScript#2225 ,它要求能夠按照您要求的方式執行interface Foo<T> extends T {...}
。 它尚未實現(可能永遠不會實現)。 現在,您只能創建一個接口來extends
具有靜態已知鍵的對象類型。 未指定的泛型類型參數T
不起作用,因為編譯器無法預測它將具有哪些鍵。
您應該放心, 交叉點是實現這一目標的合理方法(注意,如果您添加的屬性與T
屬性沖突,您將不會收到警告,正如您所注意到的)。 這是上述功能請求中的建議解決方案。 此外, Object.assign()
的TypeScript 庫類型使用交集來表示向現有對象添加屬性的結果類型。 因此, Confidence<T>
定義為
type Confidence<T> = T & {
confidenceLevel: number
}
你可以很容易地編寫一個函數來產生這樣的其中之一:
function makeConfidence<T>(x: T, confidenceLevel: number): Confidence<T> {
return Object.assign(x, { confidenceLevel });
}
並使用它:
const x = makeConfidence(new Date(), 0.9); // x is a Confidence<Date>;
console.log(x.getFullYear()); // 2020
console.log(x.confidenceLevel); 0.9
看起來挺好的。 好的,希望有幫助; 祝你好運!
您的最后一個代碼片段是正確的做法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.