我们有GetInnerType
类型,它为扩展Foo
类的每个类型返回通用类型参数:
class Foo<T> {}
type GetInnerType<X> = X extends Foo<infer I> ? I : never;
我们可以抽象GetInnerType
使其适用于任何通用类吗?
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}
答案 0 :(得分:0)
这是不可能的,因为结果没有明确定义。考虑以下示例:
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 的类型系统是 structural,而不是 nominal,因此如果两种类型具有相同的结构,那么它们就是相同的类型,即使它们被声明为不同的名称。在上面的例子中,类型A<string>
等于类型B<number>
,并且都等于{a: string, b: number}
。
因此,无论您如何定义 GetInnerType
,GetInnerType<A<string>>
的结果都必须与 GetInnerType<B<number>>
的结果相同,因此您无法在第一种情况,在第二种情况下也得到 string
。