如何实现支持嵌套类型键参数的TypeScript类型安全函数?
TypeScript嵌套键的函数类型安全实现
首先,我们有如下嵌套类型定义:
type nested = { a : { b : any, c : any, }, b : { c : any, d : any, } }
尝试直接编写函数时会遇到类型错误:
const myFunction(a : keyof nested, b: keyof nested[a]);
报错信息:
type a = /*unresolved*/ any Type 'a' cannot be used as an index type.(2538) 'a' refers to a value, but is being used as a type here. Did you mean 'typeof a'?(2749)
解决方案:使用泛型关联参数类型
要实现「第一个参数为'a'时,第二个参数只能是'b'|'c';第一个参数为'b'时,第二个参数只能是'c'|'d'」的类型约束,需要通过泛型让TypeScript关联两个参数的类型关系:
type nested = { a : { b : any, c : any, }, b : { c : any, d : any, } } const myFunction = <K extends keyof nested>(a: K, b: keyof nested[K]) => { // 这里编写函数逻辑 };
原理说明
- 泛型
K被约束为keyof nested,也就是只能取'a'或'b'; - 当调用函数传入第一个参数时,TypeScript会自动推断
K的具体值,此时keyof nested[K]会动态对应到该键下嵌套对象的键集合; - 这样就实现了两个参数的类型联动,保证第二个参数的合法性。
测试验证
调用函数时,不合法的参数会直接触发类型报错:
myFunction('a', 'b'); // ✅ 合法 myFunction('a', 'c'); // ✅ 合法 myFunction('a', 'd'); // ❌ 类型错误,'d'不属于nested['a']的键 myFunction('b', 'c'); // ✅ 合法 myFunction('b', 'd'); // ✅ 合法 myFunction('b', 'b'); // ❌ 类型错误,'b'不属于nested['b']的键
内容的提问来源于stack exchange,提问作者chilly_maximus
相关产品推荐
相关产品推荐

