给出以下示例代码:
type keys = {
a: number
b: string
}
class Model<T extends number, U extends string> { }
class ExtendedModel<T extends keys & {
c: boolean
}> extends Model<T['a'], T['b']> {
// private Keys: T // <---- try to uncomment this line
}
type ExtractExtendedModelT<ExtendedExtendedModel> = ExtendedExtendedModel extends ExtendedModel<infer U> ? U : never
class Test extends ExtendedModel<{
a: 1
b: '2'
c: false
}> { }
type TestGenericType = ExtractExtendedModelT<Test> // <---- and see the type difference
为什么我不能获得输入的Test类的通用类型,该类型应该为{ a: 1, b: '2', c: false }
仅当时,我在ExtendedModel上忽略了私有变量?如果我注册变量,我可以正确提取类型吗?
问题是,我不想向我的班级添加任何未使用的变量。 有人可以帮我理解为什么会发生这种情况,并帮助我解决这个问题吗?
答案 0 :(得分:2)
您必须
TypeScript仅在存在使用T
的成员的情况下才能推断类型T
。
TypeScript对此有一个FAQ entry:
在函数调用中推断T的类型时,我们尝试在x参数上查找T类型的成员,以弄清楚T应该是什么。因为没有使用T的成员,所以没有任何可推断的内容,因此我们返回{}。