【问题标题】:Infer the generic type parameter of any generic class推断任何泛型类的泛型类型参数
【发布时间】:2021-04-25 06:19:18
【问题描述】:

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

【问题讨论】:

  • 谢谢。您链接的问题是相关的,但没有回答我的问题。如何在无需创建更多类型的情况下为任何类型执行此操作?
  • 你没有。我已经链接了这个问题,因为有评论者要求同样的事情,结论是目前不可能。
  • 这个特性被称为高级类型。它在 TypeScript 中不可用

标签: typescript generic-type-parameters


【解决方案1】:

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

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&lt;string&gt; 类型等于B&lt;number&gt; 类型,并且两者都等于{a: string, b: number}

所以不管你怎么定义GetInnerTypeGetInnerType&lt;A&lt;string&gt;&gt;的结果必然和GetInnerType&lt;B&lt;number&gt;&gt;的结果一样,所以你不能在第一种情况下得到string也得到number第二种情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-05
    • 1970-01-01
    • 2014-08-31
    相关资源
    最近更新 更多