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

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') 合法,返回值类型为number
  • fn('b', '4') 合法,返回值类型为number
  • fn('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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 05:54:04