如何确保TypeScript函数的两个参数为联合类型的同一取值?
解决方案:让函数参数严格保持同类型匹配
你的问题出在泛型的设计上,原代码用了两个泛型T和K extends T,当T是联合类型时,K只要是T的任意子类型就会被允许,这就导致传入固定字面量(比如"Orange")时,TS会认为它符合K extends T的约束(因为"Orange"是"Orange" | "Apple"的子类型),但这不符合你要求的「两个参数必须始终为同一种水果」的逻辑。
修正后的函数实现
只需要保留单个泛型T,让第二个参数的类型直接等于T,而不是K extends T:
type Fruit = "Orange" | "Apple" | "Banana"; function doubleFruit<T extends Fruit>(fruit1: T, fruit2: T) { // 此时fruit1和fruit2的类型完全一致 }
验证预期行为
固定值场景(符合预期)
// 报错:类型不匹配 doubleFruit("Orange", "Apple"); doubleFruit("Orange", "Banana"); // 正常运行:类型完全一致 doubleFruit("Apple", "Apple");
动态联合类型场景(符合预期)
function run(x: "Orange" | "Apple") { // 允许:x的类型和两个参数的类型完全匹配,无论x取哪个值都满足同类型 doubleFruit(x, x); // 禁止:固定字面量仅匹配联合类型的一部分分支,TS会检测到类型不兼容 doubleFruit(x, "Orange"); // 报错 doubleFruit(x, "Apple"); // 报错 }
原理说明
当第一个参数的类型是联合类型"Orange" | "Apple"时,泛型T会被推断为这个联合类型,此时第二个参数必须满足同时兼容联合类型的所有分支。只有传入同一个变量x时,它的类型和第一个参数完全一致,而固定字面量只能匹配联合类型中的一个分支,无法覆盖所有可能的情况,因此TS会抛出类型错误,完美符合你的需求。
内容的提问来源于stack exchange,提问作者praveshishere
相关产品推荐
相关产品推荐

