如何根据第一个参数的值指定第二个参数的类型?
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
相关产品推荐
相关产品推荐

