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

如何通过泛型类型访问TypeScript接口中嵌套对象的键?

解决TypeScript嵌套对象键的watch函数类型支持问题

要让watch函数支持嵌套对象的键,你需要定义一个递归类型来提取所有层级的属性路径,替代原本的keyof T。

1. 定义嵌套键路径类型

创建NestedKeyOf类型,递归遍历对象的所有嵌套属性,生成包含完整路径的字符串字面量联合类型:

type NestedKeyOf<T extends object> = {
  [K in keyof T & string]: T[K] extends object
    ? `${K}` | `${K}.${NestedKeyOf<T[K]>}`
    : `${K}`
}[keyof T & string]

这个类型会自动处理嵌套结构:

  • 遍历对象的每个顶层键K
  • 若T[K]仍是对象,则递归生成K.子键形式的路径,同时保留K本身
  • 最终输出所有可能的属性路径(包括顶层和嵌套)

2. 调整myFunc的类型定义

将watch方法的参数类型替换为NestedKeyOf<T>:

function myFunc<T extends object>(): {
  watch: (type: NestedKeyOf<T>) => void
} {
  return { watch: () => {} }
}

interface Props {
  name: string
  age: number
  height: {
    ok: boolean
  }
}

const { watch } = myFunc<Props>()
watch('age') // 正常支持顶层键
watch('height.ok') // 现在可正确传入嵌套键

扩展支持(可选)

如果需要支持数组索引(比如list[0].name),可以修改NestedKeyOf类型,添加数组的处理逻辑:

type NestedKeyOf<T extends object> = {
  [K in keyof T & (string | number)]: T[K] extends (infer U)[]
    ? `${K}` | `${K}[number].${NestedKeyOf<U extends object ? U : never>}`
    : T[K] extends object
    ? `${K}` | `${K}.${NestedKeyOf<T[K]>}`
    : `${K}`
}[keyof T & (string | number)]

内容的提问来源于stack exchange,提问作者Verdo Fanv

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 20:45:57