[英]infer keyword to get generic type from base class
考慮以下課程
class SomeBaseClass<T extends string | number> {
...
}
以下條件類型使用infer
關鍵字
type ExtractInner<T> = T extends SomeBaseClass<infer U> ? U : T;
有了這個,我們可以像這樣提取SomeBaseClass
使用的泛型類型(這是來自文檔,或多或少)
type InferredString = ExtractInner<SomeBaseClass<string>> // InferredString is just type string
在稍微更高級的場景中,以下是這種情況
class StringVersion extends SomeBaseClass<string> {
...
}
class NumberVersion extends SomeBaseClass<number> {
...
}
如何定義ExtractInnerWithExtend
類型,使其等效於ExtractInner
? 即:
type InferredStringWithExtend = ExtractInnerWithExtend<StringVersion> // InferredStringWithExtend should be string
type InferredNumberWithExtend = ExtractInnerWithExtend<NumberVersion> // InferredStringWithExtend should be number
在這種情況下使用ExtractInner
將導致簡單的string | number
string | number
,我實際上期望獲得string
或number
,而不是聯合類型。 這可能是個錯誤嗎? 我正在嘗試的是什么?
提前謝謝了。
ExtractInner
將使用一個條件處理類型的派生版本:您實際上以某種方式使用基類中的類型
class SomeBaseClass<T extends string | number> {
private value!: T
// Any of these will also work
//value!: T
//m(v:T): void {}
//m(): T { return null as any }
}
type ExtractInner<T> = T extends SomeBaseClass<infer U> ? U : T;
class StringVersion extends SomeBaseClass<string> {}
class NumberVersion extends SomeBaseClass<number> {}
type InferredStringWithExtend = ExtractInner<StringVersion> // string
type InferredNumberWithExtend = ExtractInner<NumberVersion> // number
這種行為的原因是typescript類型系統的結構性質,類型結構比繼承聲明更重要。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.