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}
解决方案
这是不可能的,因为结果没有明确定义。考虑下面的例子:
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
在第二种情况下获得。
推荐阅读
- c# - OLEDBConnection:将字节 [] 插入 blob 不会保存更改
- scala - 如何在 Streamsets 中使用 Scala 或 Pyspark 使用 Apache Spark 进行机器学习?
- git - 没有 Github 操作的单推
- matlab - 我需要在 ubuntu 20.04 上安装 gcc4.9 | matlab 墨西哥
- sql-server - 失去与映射网络驱动器的连接后恢复远程数据库
- ios - 如何让我在 iOS 14 上运行的 PWA 使用浏览器发起的会话?
- python - 如何从外部文件中指定 argparse 选项?
- python - 如何实现python aiogram bot的自动重新加载?
- c++ - 如何检查认知访问令牌是否已过期?
- azure - 'resourceGroupName' 与预期的模式 '^[-\w\._\(\)]+$' 不匹配