如何通过泛型类型访问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
相关产品推荐
相关产品推荐

