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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 16:52:11