如何让TypeScript对象类型根据属性值自动推断泛型参数?
解决方案
要实现让TypeScript根据a的取值自动推断泛型T,你可以借助泛型函数来完成——TypeScript对函数的泛型参数支持自动推断,而直接使用泛型类型别名时必须显式指定参数。
具体实现如下:
type MyLiterals = 'a' | 'b' type MyObject<T extends MyLiterals> = { a: T, b: T extends 'a' ? number : string } // 泛型函数用于自动推断类型 function createMyObject<T extends MyLiterals>(obj: MyObject<T>): MyObject<T> { return obj } // 无需手动指定泛型,TS自动推断T为'b',b被约束为string类型 const obj1 = createMyObject({ a: 'b', b: '' }) // a为'a'时,TS自动推断T为'a',b必须是number类型 const obj2 = createMyObject({ a: 'a', b: 123 }) // 错误示例:a为'a'时传入string类型的b会触发类型检查报错 const obj3 = createMyObject({ a: 'a', b: 'error' // 类型“string”的参数不能赋给类型“number”的参数 })
原理说明
- 直接使用
MyObject类型注解时,TypeScript无法自动推断泛型参数T,必须显式传入,这是泛型类型别名的固有特性。 - 泛型函数的参数可以利用上下文类型推断,根据传入对象中
a的取值自动确定T的类型,进而约束b的类型,完全匹配你的需求。
内容的提问来源于stack exchange,提问作者Mino
相关产品推荐
相关产品推荐

