簡體   English   中英

推斷任何泛型 class 的泛型類型參數

[英]Infer the generic type parameter of any generic class

我們有GetInnerType類型,它為擴展Foo class 的每個類型返回泛型類型參數:

class Foo<T> {}

type GetInnerType<X> = X extends Foo<infer I> ? I : never;

我們可以抽象GetInnerType以便它與任何通用 class 一起使用嗎?

新版本的GetInnerType應如下所示:

class Bar<T>{}

let v1 = new Foo<number>();
let v2 = new Bar<{a: string}>();
type t1 = GetInnerType<typeof v1>; // is number
type t2 = GetInnerType<typeof v2>; // is {a: string}

這是不可能的,因為結果沒有明確定義。 考慮下面的例子:

class A<T> {
    constructor(public a: T, public b: number) {}
}

class B<T> {
    constructor(public a: string, public b: T) {}
}

// true
type AextendsB = A<string> extends B<number> ? true : false

// true
type BextendsA = B<number> extends A<string> ? true : false

游樂場鏈接

Typescript 的類型系統是結構的,而不是標稱的,所以如果兩個類型具有相同的結構,那么它們就是相同的類型,即使它們被聲明為不同的名稱。 在上面的例子中,類型A<string>等於類型B<number> ,並且兩者都等於{a: string, b: number}

隨之而來的是,無論您如何定義GetInnerTypeGetInnerType<A<string>>的結果必然與GetInnerType<B<number>>的結果相同,因此您無法在第一種情況下獲取string ,也無法獲取number第二種情況。

暫無
暫無

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

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