[英]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}
。
隨之而來的是,無論您如何定義GetInnerType
, GetInnerType<A<string>>
的結果必然與GetInnerType<B<number>>
的結果相同,因此您無法在第一種情況下獲取string
,也無法獲取number
第二種情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.