首页 > 解决方案 > 推断任何泛型类的泛型类型参数

问题描述

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

标签: typescriptgeneric-type-parameters

解决方案


这是不可能的,因为结果没有明确定义。考虑下面的例子:

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 的类型系统是结构的,而不是标称的,所以如果两个类型具有相同的结构,那么它们就是相同的类型,即使它们被声明为不同的名称。在上面的例子中, typeA<string>等于 type B<number>,并且两者都等于{a: string, b: number}

随之而来的是,无论您如何定义GetInnerType, 的结果GetInnerType<A<string>>都必然与 的结果相同GetInnerType<B<number>>,因此您不能string在第一种情况下也能number在第二种情况下获得。


推荐阅读