如何让TypeScript的transform函数正确推断联合类型?
解决方案
TypeScript 默认会将数组推断为同构数组类型(所有元素类型一致),所以传入[{ value: 'a' }, { value: 1 }]时,它会优先匹配第一个元素的string类型,导致第二个number元素触发类型不兼容错误。以下两种方法可以解决这个问题:
方法一:调用时使用const断言
在调用的数组后添加as const,让 TypeScript 保留元素的字面量类型并自动推断联合类型:
transform([{ value: 'a' }, { value: 1 }] as const);
此时返回类型为Bar<"a" | 1>,如果需要将字面量类型拓宽为string | number,可以手动指定泛型:
transform<string | number>([{ value: 'a' }, { value: 1 }]);
方法二:修改函数泛型定义
调整函数的泛型逻辑,让它自动从数组元素中提取value的联合类型,无需手动断言:
interface Foo<T> { value: T; } interface Bar<T> { value: T; } function transform<T extends Foo<any>[]>(foos: T): Bar<T[number]['value']> { // 根据实际需求实现转换逻辑 return { value: foos[0].value } as Bar<T[number]['value']>; } // 调用示例,自动推断返回类型为 Bar<string | number> transform([{ value: 'a' }, { value: 1 }]);
这种方式更灵活,无论传入多少种不同类型的Foo元素,都能自动生成对应的联合类型返回值。
内容的提问来源于stack exchange,提问作者Lehks
相关产品推荐
相关产品推荐

