簡體   English   中英

推斷關鍵字以從基類獲取泛型類型

[英]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 ,我實際上期望獲得stringnumber ,而不是聯合類型。 這可能是個錯誤嗎? 我正在嘗試的是什么?

提前謝謝了。

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.

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