TypeScript如何使用泛型定义基于对象键的函数
问题解决方案
错误原因
你写的keyof T存在类型逻辑错误:T是外层对象obj的键类型(也就是'a' | 'b'的字面量联合类型),keyof T取的是字符串类型的内置属性键,根本不是obj[T]对应的内层对象的键,自然无法用来索引内层对象。
正确写法
直接定义两个泛型分别约束两层键即可,不需要提前显式声明对象的完整类型:
const fn = <T extends keyof typeof obj, K extends keyof typeof obj[T]>(key1: T, key2: K) => { return obj[key1][key2]; }
效果验证
调用的时候TS会自动推导两层键的合法范围,输入非法键会直接报错:
fn('a', '3')合法,返回值类型为numberfn('b', '4')合法,返回值类型为numberfn('a', '4')会直接触发TS类型报错,提示4不是a对应的内层对象的合法键
更通用的封装方案
如果需要适配任意同结构的对象,可以把对象作为参数传入,进一步解耦:
const getNestedValue = < O extends Record<string, Record<string, unknown>>, T extends keyof O, K extends keyof O[T] >(obj: O, key1: T, key2: K) => { return obj[key1][key2]; }
内容的提问来源于stack exchange,提问作者wongx
相关产品推荐
相关产品推荐

