You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 17:20:30