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

TypeScript中反射嵌套属性字面量的实现问题

解决多层嵌套对象的所有字符串属性提取问题

嘿,我完全懂你现在的困扰——刚接触TS/JS时,多层嵌套的对象确实容易让人摸不着头脑,只拿到顶层属性可太让人着急了😉

问题的核心在于:普通的顶层遍历只会处理第一级属性,不会自动深入嵌套的子对象。我们需要写一个递归函数,让它自动钻到每一层,把所有字符串类型的属性名(带完整层级路径)和对应值都收集起来。

步骤1:确保运行时有实际的Names对象

首先要注意:你写的declare module只是TypeScript的类型定义,不会生成实际的JavaScript对象。所以你需要有对应的运行时对象,比如:

// 实际运行时的Names对象(和你定义的类型结构一致)
const Names = {
  name1: "value1",
  name2: "value2",
  name3: {
    name3SubName1: "subValue1",
    name3SubName2: "subValue2",
    // 可以再加更深的嵌套测试
    name3SubName3: {
      deepName: "deepValue"
    }
  }
};

步骤2:编写递归提取函数

下面这个函数会递归遍历每一层对象,收集所有字符串属性:

// 定义结果类型:键是属性的完整层级路径,值是对应的字符串
type PropertyMap = Record<string, string>;

function extractAllStringProperties(
  obj: unknown,
  parentPath = "",
  result: PropertyMap = {}
): PropertyMap {
  // 非对象/ null直接返回,终止递归
  if (typeof obj !== "object" || obj === null) {
    return result;
  }

  // 遍历当前对象的所有自身属性
  for (const key in obj) {
    if (Object.prototype.hasOwnProperty.call(obj, key)) {
      // 拼接当前属性的完整路径(比如"name3.name3SubName1")
      const currentPath = parentPath ? `${parentPath}.${key}` : key;
      const value = (obj as Record<string, unknown>)[key];

      // 如果是字符串属性,直接存入结果
      if (typeof value === "string") {
        result[currentPath] = value;
      } 
      // 如果是嵌套对象(排除数组,按需调整),递归处理子对象
      else if (typeof value === "object" && value !== null && !Array.isArray(value)) {
        extractAllStringProperties(value, currentPath, result);
      }
    }
  }

  return result;
}

步骤3:调用函数并查看结果

直接调用这个函数,就能得到所有层级的属性了:

const allProperties = extractAllStringProperties(Names);
console.log(allProperties);

输出结果会是:

{
  "name1": "value1",
  "name2": "value2",
  "name3.name3SubName1": "subValue1",
  "name3.name3SubName2": "subValue2",
  "name3.name3SubName3.deepName": "deepValue"
}

关键细节说明

  • 递归逻辑:每次遇到嵌套对象,就带着当前的属性路径递归调用函数,这样就能完整记录每个属性的层级位置
  • 类型安全:用unknown作为参数类型,配合类型断言处理TS的类型检查,避免报错
  • 属性过滤:用hasOwnProperty确保只处理对象自身的属性,不会遍历原型链上的冗余属性
  • 可扩展性:如果你的嵌套里有数组,只需要加一段处理数组的逻辑(比如遍历数组元素再递归)就行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:51:47