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

如何根据第一个参数的值指定第二个参数的类型?

TypeScript 实现基于第一个参数的参数类型约束

你可以通过两种常用方式实现这种参数类型关联约束:

方法一:函数重载

直接定义多个重载签名,明确每种参数组合的类型要求:

// 重载签名:定义合法的参数组合
function test(firstParam: 'isText', secondParameter: string): void;
function test(firstParam: 'isNumber', secondParameter: number): void;

// 实现签名:兼容所有合法参数类型(仅用于函数内部逻辑)
function test(firstParam: 'isText' | 'isNumber', secondParameter: string | number): void {
  // 编写你的函数逻辑
}

// 测试调用
test('isText', 2);       // ❌ 类型错误(符合预期)
test('isText', "hey");   // ✅ 正常
test('isNumber', 123);   // ✅ 正常
test('isNumber', "123"); // ❌ 类型错误(符合预期)

重载签名会告诉TypeScript哪些参数组合是合法的,调用时会自动匹配对应的签名进行类型检查,实现体则需要兼容所有合法的参数类型。

方法二:泛型 + 映射类型

通过映射类型建立参数值与类型的对应关系,更适合后续需要扩展参数类型的场景:

// 定义参数值与对应类型的映射
type EvtMapping = {
  isText: string;
  isNumber: number;
};

// 使用泛型约束参数关联关系
function test<K extends keyof EvtMapping>(firstParam: K, secondParameter: EvtMapping[K]): void {
  // 编写你的函数逻辑
}

// 测试调用
test('isText', 2);       // ❌ 类型错误(符合预期)
test('isText', "hey");   // ✅ 正常
test('isNumber', 456);   // ✅ 正常
test('isNumber', "456"); // ❌ 类型错误(符合预期)

这种方式通过EvtMapping统一管理参数值与类型的对应关系,后续新增参数类型时,只需要在EvtMapping中添加新的键值对即可,无需修改函数签名,扩展性更强。

内容的提问来源于stack exchange,提问作者Neta Meta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 18:52:39