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

如何实现依赖父函数输入的嵌套函数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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 19:42:50