如何正确使用内部结构不同的TypeScript联合类型
报错原因
这并非TypeScript的bug,属于其类型系统的现有设计限制。TypeScript对联合类型的属性推导是独立处理的,不会自动跟踪同一实例多个属性之间的关联关系:
当从Categories联合类型的参数中分别读取testName和name属性时,TS只会将两个属性各自推导为'category1' | 'category2'的联合类型,不会感知到二者必然来自同一个联合分支、取值一定是匹配的。因此拼接成对象后,TS会判定该对象无法匹配ComputedCategories要求的「两个属性取值必须同属一个分支」的约束,进而抛出类型错误。
解决方案
无需编写类型守卫,可通过泛型约束实现类型匹配,是最推荐的写法:
// 通过泛型绑定入参与返回值的属性对应关系 const computeCategory = <T extends Categories>(category: T): Extract<ComputedCategories, { computed: T['testName'] }> => ({ computed: category.testName, name: category.name })
如果仅需要临时快速修复,确定业务逻辑不存在非法入参的情况下,也可以直接使用类型断言:
const computeCategory = (category: Categories): ComputedCategories => ({ computed: category.testName, name: category.name } as ComputedCategories)
内容的提问来源于stack exchange,提问作者C. Johnson
相关产品推荐
相关产品推荐

