如何在TypeScript中实现两个参数值不同的类型检查?
实现函数参数c1和c2的不同值类型检查
原代码的错误在于Exclude<Country, c2>的用法——这里的c2是对象属性名,并非类型,无法直接用于类型排除。要实现强制c1和c2值不同的类型检查,可以通过泛型捕获参数类型的方式来实现:
type Country = "usa" | "uk" | "canada"; // 用泛型T绑定c1的具体类型,c2的类型为排除T后的Country子类型 function match<T extends Country>({ c1, c2 }: { c1: T; c2: Exclude<Country, T> }) {} match({ c1: 'usa', c2: 'usa' }); // 触发类型错误,符合预期 match({ c1: 'uk', c2: 'usa' }); // 类型校验通过,符合预期
原理说明:
- 泛型
T会在函数调用时自动推断出c1的具体类型(比如传入'usa'时,T就是"usa")。 Exclude<Country, T>会从Country联合类型中剔除T对应的类型,确保c2只能是和c1不同的国家值。
另外注意:原代码中调用match时直接传两个字符串是错误的,因为函数定义接收的是一个包含c1和c2属性的对象,所以调用时要以对象形式传参。
内容的提问来源于stack exchange,提问作者Majid Majed
相关产品推荐
相关产品推荐

