如何实现依赖父函数输入的嵌套函数TypeScript类型约束?
解决TypeScript中嵌套函数参数类型依赖外层输入的问题
你需要实现一个外层函数,它接收字典的顶层key后返回一个内层函数,内层函数的合法输入必须对应外层所选顶层key下的嵌套对象的key。当前代码中TypeScript错误地将内层函数的参数类型限制为所有嵌套对象共有的key(仅"a"),导致传入"b"这类合法key时触发类型错误。
解决方案:使用泛型保留具体类型信息
核心思路是给外层函数添加泛型约束,让TypeScript记住你传入的具体顶层key类型,从而为内层函数推导精准的嵌套key类型。
修改后的完整代码:
const dictionary = { "1": { a: "a", b: "b", c: "c" }, "2": { a: "a", d: "d" } } // 给外层函数添加泛型K,约束为字典的顶层key类型 const func = <K extends keyof typeof dictionary>(componentKey: K) => { // 此时dictionary[componentKey]的类型会被精准推断为对应K的嵌套对象 return (nestedKey: keyof typeof dictionary[K]) => { return dictionary[componentKey][nestedKey]; }; }; // 合法:func("1")返回的函数允许"a"/"b"/"c" const test1 = func("1")("b"); // 合法:func("2")返回的函数允许"a"/"d" const test2 = func("2")("d"); // 非法:TypeScript会报错,"d"不属于"1"对应的嵌套对象的key // const test3 = func("1")("d");
为什么原代码无法正常工作?
原代码中,外层函数的componentKey类型是keyof typeof dictionary(即"1"|"2"),此时obj = dictionary[componentKey]的类型会被推断为所有嵌套对象的联合类型:{a: string, b: string, c: string} | {a: string, d: string}。
而keyof作用于联合类型时,只会返回所有联合成员共有的key(也就是只有"a"),这就导致内层函数的参数被错误限制为仅"a"。
通过泛型K extends keyof typeof dictionary,我们让TypeScript将componentKey的类型锁定为你传入的具体字面量类型(比如"1"或"2"),此时keyof typeof dictionary[K]就能精准对应到该顶层key下嵌套对象的所有合法key,从而实现预期的类型约束。
内容的提问来源于stack exchange,提问作者Robert Pakko
相关产品推荐
相关产品推荐

