给定此示例代码:
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 的输入泛型类型,只有当我省略 ExtendedModel 上的私有变量时,它才应该{ a: 1, b: '2', c: false }
?而如果我注册变量,我可以正确提取类型吗?
问题是,我不想向我的类添加任何未使用的变量。有人可以帮助我理解为什么会发生这种情况并帮助我解决这个问题吗?
链接到TS游乐场
你必须
TypeScript 只有在存在使用 T
的成员时才能推断类型T
。
TypeScript 有一个关于这个的常见问题解答条目:
在函数调用中推断 T 的类型时,我们尝试在 x 参数上查找类型 T 的成员,以确定 T 应该是什么。因为没有使用 T 的成员,所以没有什么可以推断的,所以我们返回 {}。