【发布时间】:2022-01-11 13:41:52
【问题描述】:
我试图在 Typescript 中推断泛型,但我似乎无法控制我做错了什么。我的具体例子会比较大,留在这里,但我做了一个小的打字稿游乐场链接,它完全说明了我面临的问题。
这是link
基本上,我试图从类层次结构中推断出一个通用参数:
type payloadType = {
[key:string]: string
}
type specificPayloadB = {
a: string
}
type specificPayloadC = {
a: string,
b: string
}
class A<TPayload extends payloadType = any> {}
class B<TPayload extends specificPayloadB = specificPayloadB> extends A<TPayload> {}
class C extends B<specificPayloadC> {}
type InferKeys<TType> = TType extends A<infer Keys> ? Keys : never;
class extender<
TType extends A,
TKeys = InferKeys<TType>
> {}
function getClass<TClass extends A>(): extender<TClass> {
return new extender<TClass>();
}
let testExtenderB = getClass<B>();
let testExtenderC = getClass<C>();
上面的例子没有给出编译错误,但是当用 typescript 检查返回的变量类型时,testExtenderB 被识别为 extender<B<specificPayloadB>, payloadType> 这是正确的,但根据提供的信息,它可以更正确地识别为extender<B<specificPayloadB>, specificPayloadB>。
我认为testExtenderC 变量也是如此,它被标识为extender<C, payloadType>,而不是被标识为extender<C, specificPayloadC>。
我在这里做错了吗?是否可以在不向 typescript 显式提供类型的情况下实现变量的正确识别?
【问题讨论】: