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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 11:20:33