typescript - TypeScript 条件类型的类在结构上是等效的
问题描述
我有以下内容:
declare class Base {
constructor(a: string)
}
declare class A extends Base {
constructor(a: number)
}
declare class B extends Base {
constructor(a: object)
}
declare class C extends Base {
constructor(a: boolean)
}
type ResponseMapper<T extends Base> = T extends A
? number
: T extends B
? object
: T extends C
? boolean
: never;
declare function getValue<T extends Base>(input: T): ResponseMapper<T>
let x: number = getValue(new A(1))
let y: object = getValue(new B({}))
let z: boolean = getValue(new C(true))
这并不完全有效,因为 A、B 和 C 在结构上都是等效的。所以 in ,如果我传递一个or inResponseMapper
的实例,它仍然评估为。所以变量声明最终成为类型错误。B
C
number
y
z
我想出一种解决方法是为每个类添加一个假属性,使类型在结构上不再等效。所以这有效:
declare class Base {
constructor(a: string)
}
declare class A extends Base {
_name?: "A"
constructor(a: number)
}
declare class B extends Base {
_name?: "B"
constructor(a: object)
}
declare class C extends Base {
_name?: "C"
constructor(a: boolean)
}
type ResponseMapper<T extends Base> = T extends A
? number
: T extends B
? object
: T extends C
? boolean
: never;
declare function getValue<T extends Base>(input: T): ResponseMapper<T>
let x: number = getValue(new A(1))
let y: object = getValue(new B({}))
let z: boolean = getValue(new C(true))
有没有更好的方法来让它工作而不需要添加一个假字段?
解决方案
在这里,尝试使用这种类型:
type ResponseMapper<T, U> = T extends new (a: infer R) => U ? R : never;
declare function getValue<T extends new (a: V) => U, U, V = ResponseMapper<T, U>>(input: U): V;
推荐阅读
- postgresql - Postgresql:使用两个内部连接进行更新 [MySQL 到 PostgreSQL]
- java - 为什么我不能将我的答案添加到 readwrite.txt。?
- c# - 无法使用 Rebex 库正确创建受密码保护的 zip 文件
- entity-framework - EF Core 允许将私有字段映射到模型。但是我如何在不检索整个模型的情况下选择这个私有字段
- python - 创建一个保持其形状的 0 和 1 矩阵
- python - markdown2.py 可以呈现为 utf-8 吗?
- python - 从numpy中的其他矩阵制作最大结果矩阵的最有效方法?
- python - 是否可以在 HTCondor 中检索 python 脚本的输出?
- corda - 关于附件上传和下载的问题
- python - 烧瓶测试:self.client.delete() 返回 200 但失败,因为他没有删除任何内容