如何在TypeScript中根据参数值实现类型校验?
解决方案:根据参数值约束关联参数类型
要实现参数值与对应类型的绑定,有两种常用方案:
方案1:函数重载
这是最直观的实现方式,通过定义多个函数签名,明确不同arg1取值对应的arg2类型:
// 定义重载签名,明确参数关联关系 function func(arg1: 'text', arg2: string): void; function func(arg1: 'numeric', arg2: number): void; // 函数实现(这里的参数类型是所有重载的联合) function func(arg1: 'text' | 'numeric', arg2: string | number): void { // 业务逻辑示例 if (arg1 === 'text') { console.log(arg2.toUpperCase()); } else { console.log(arg2.toFixed(2)); } } // 调用验证 func('text', "sdf") // ✅ 类型正确 func('text', 1) // ❌ 类型错误(符合预期) func('numeric', 1) // ✅ 类型正确 func('numeric', "sdf") // ❌ 类型错误(符合预期)
函数重载会让TypeScript根据传入的arg1值,自动匹配对应的arg2类型约束,避免错误的参数组合。
方案2:泛型+条件类型
如果偏好泛型写法,可以用条件类型推导arg2的类型:
// 定义条件类型,根据arg1的类型返回对应的arg2类型 type Arg2Type<T extends 'text' | 'numeric'> = T extends 'text' ? string : number; // 泛型函数绑定参数类型 function func<T extends 'text' | 'numeric'>(arg1: T, arg2: Arg2Type<T>): void { if (arg1 === 'text') { console.log(arg2.toUpperCase()); } else { console.log(arg2.toFixed(2)); } } // 调用验证 func('text', "sdf") // ✅ func('text', 1) // ❌ func('numeric', 1) // ✅ func('numeric', "sdf") // ❌
这种方式通过泛型捕获arg1的具体类型,再用条件类型动态推导arg2的类型,实现参数间的类型绑定。
你之前的代码问题在于:arg1和arg2是独立的联合类型,TypeScript无法关联两者的取值关系,因此会允许错误的参数组合。
内容的提问来源于stack exchange,提问作者Pytan
相关产品推荐
相关产品推荐

