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

如何实现支持嵌套类型键参数的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 05:24:21