簡體   English   中英

打字稿擴展通用接口

[英]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

看起來挺好的。 好的,希望有幫助; 祝你好運!

Playground 鏈接到代碼

您的最后一個代碼片段是正確的做法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM