如何在TypeScript中实现带自动补全的递归树状元组?
实现带层级参数补全的TypeScript递归属性获取函数
你需要的是让getValueTyped函数支持上下文感知的参数自动补全——每输入一个属性键,下一个参数的提示会自动匹配该键对应值的属性列表。之前的TreeKeys类型定义存在两个核心问题:一是错误判断了键的类型(K是属性名,不可能是object),二是无法处理任意深度的递归路径。
正确的类型定义与函数实现
首先定义表示对象所有可能属性路径的递归类型Path,它会遍历对象的每一层属性,生成对应的路径元组:
type Path<T> = T extends object ? { [K in keyof T]: [K] | [K, ...Path<T[K]>] }[keyof T] : [];
接着,基于Path类型实现getValueTyped函数,同时优化返回值类型,让它自动推导最终属性的具体类型(而非any):
// 推导路径对应的属性值类型 type PathValue<T, P extends Path<T>> = P extends [infer K extends keyof T] ? T[K] : P extends [infer K extends keyof T, ...infer Rest extends Path<T[K]>] ? PathValue<T[K], Rest> : never; function getValueTyped<T extends object, P extends Path<T>>(obj: T, ...keys: P): PathValue<T, P> { let result = obj as any; for (const key of keys) { result = result[key]; } return result; }
测试验证
用你的测试对象验证,参数补全和类型推导都能正常工作:
const testObject = { hello: { world: "Hello world!", user: "Hello user!" }, first: { second: 2 }, shallow: { deep: true } }; // 输入"hello"后,下一个参数自动提示"world"|"user" getValueTyped(testObject, "hello", "world"); // 返回类型为string,值为"Hello world!" getValueTyped(testObject, "first"); // 返回类型为{ second: number } getValueTyped(testObject, "shallow", "deep"); // 返回类型为boolean
关键说明
Path类型通过递归遍历对象的每一层属性,生成所有可能的路径元组,TypeScript会根据已输入的参数自动筛选符合当前上下文的路径选项。PathValue类型配合函数泛型,能自动推导最终返回值的具体类型,避免使用any带来的类型不安全问题。
内容的提问来源于stack exchange,提问作者DeMineArchiver
相关产品推荐
相关产品推荐

