TypeScript不使用函数能否通过纯类型语法推导泛型参数?
结论
截止最新的TypeScript 5.x版本,不存在纯类型层面的语法可以实现该场景下的泛型自动推导。
原因说明
TypeScript的显式类型注解要求标注值必须是一个完整的、确定的类型:MyType本身是需要传入泛型参数的泛型类型,属于不完整的类型定义,无法直接作为变量的类型注解使用,因此直接写const myType: MyType必然会抛出缺少泛型参数的报错。
现有可行替代方案
泛型工厂函数(当前最优方案)
你正在使用的这个方案是目前最推荐的实现方式,运行时只有一个透传返回值的简单函数,几乎没有额外开销,同时可以在你编写对象字面量的时候实时校验类型,泛型参数完全自动推导不需要手动传入:function typed<T extends string>(val: MyType<T>) { return val; } const myType = typed({ foo: { a: null, b: null }, bar: { whatever: 'a' } }) // 自动推导为 MyType<'a'|'b'>先定义值再反向推导泛型参数
如果你不想引入额外的函数,可以用两步写法先定义原始值再反向推导泛型:const rawValue = { foo: { a: null, b: null }, bar: { whatever: 'a' } } type T = keyof typeof rawValue.foo const myType: MyType<T> = rawValue该方案的缺点是:对象编写阶段不会实时校验
bar的值是否和foo的key匹配,只有最后赋值给myType的时候才会抛出类型错误。手动指定泛型参数
如果你能明确知道泛型的取值范围,直接手动传入泛型参数是最直接的原生语法:const myType: MyType<'a' | 'b'> = { foo: { a: null, b: null }, bar: { whatever: 'a' } }
未来可能的支持
TypeScript社区目前已有相关提案,支持在类型注解中直接推导泛型参数,写法类似const myType: MyType<infer T>,该提案目前尚未纳入正式版本的迭代计划,暂时无法使用。
内容的提问来源于stack exchange,提问作者Zach Bonfil
相关产品推荐
相关产品推荐

