提取通用类型而不返回输入类型

时间:2019-06-14 06:13:07

标签: typescript type-inference

给出以下示例代码:

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上忽略了私有变量?如果我注册变量,我可以正确提取类型吗?

问题是,我不想向我的班级添加任何未使用的变量。 有人可以帮我理解为什么会发生这种情况,并帮助我解决这个问题吗?

Link to TS Playground

1 个答案:

答案 0 :(得分:2)

您必须

TypeScript仅在存在使用T的成员的情况下才能推断类型T

TypeScript对此有一个FAQ entry

  

在函数调用中推断T的类型时,我们尝试在x参数上查找T类型的成员,以弄清楚T应该是什么。因为没有使用T的成员,所以没有任何可推断的内容,因此我们返回{}。