推断任何泛型类的泛型类型参数

时间:2020-08-12 13:55:31

标签: typescript

我们有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}

1 个答案:

答案 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

Playground Link

Typescript 的类型系统是 structural,而不是 nominal,因此如果两种类型具有相同的结构,那么它们就是相同的类型,即使它们被声明为不同的名称。在上面的例子中,类型A<string>等于类型B<number>,并且都等于{a: string, b: number}

因此,无论您如何定义 GetInnerTypeGetInnerType<A<string>> 的结果都必须与 GetInnerType<B<number>> 的结果相同,因此您无法在第一种情况,在第二种情况下也得到 string