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

TypeScript中能否遍历未实例化类的属性名?需生成配置对象

TypeScript 基于类属性自动生成配置对象方案

核心问题说明

TypeScript 是编译时类型系统,运行时无法直接获取类的属性元数据,所以要实现新增类属性时自动生成对应配置,需要结合类型工具和运行时数据维护来实现。

1. 用类型工具锁定可配置属性

首先通过 keyof 和 Exclude 提取类中除 status(作为外层对象键)之外的属性类型,确保后续逻辑的类型安全:

type ExcludeStatus<T> = Exclude<keyof T, 'status'>;
type ConfigurableProps = ExcludeStatus<DetailedDefaultsObject>; // 得到 'description' | 'model'

2. 运行时获取属性列表的两种方式

方式一:手动维护属性数组(简单直接)

手动定义可配置属性的数组,TypeScript 会自动校验数组元素是否属于类的属性:

const configurableProps: ConfigurableProps[] = ['description', 'model'];

后续新增类属性时,只需在这个数组中添加对应属性名即可。

方式二:借助装饰器自动收集(适合复杂场景)

在 tsconfig.json 中开启元数据相关配置:

{
  "compilerOptions": {
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true
  }
}

用装饰器标记类并注入属性元数据,运行时通过 Reflect 获取:

import 'reflect-metadata';

@Reflect.metadata('configProps', ['description', 'model'])
export class DetailedDefaultsObject {
  status: number;
  description?: string;
  model?: any;
}

const configurableProps = Reflect.getMetadata('configProps', DetailedDefaultsObject) as ConfigurableProps[];

3. 生成目标配置对象的逻辑

假设外部默认值字典结构如下:

const defaultDict = {
  description: {
    200: '请求成功',
    404: '资源不存在'
  },
  model: {
    200: { result: {} },
    404: null
  }
};

编写生成函数,遍历状态列表和可配置属性,自动填充默认值:

function buildStatusConfig(statusList: number[], defaults: typeof defaultDict) {
  const config: Record<number, Pick<DetailedDefaultsObject, ConfigurableProps>> = {};

  statusList.forEach(status => {
    config[status] = {} as any;
    configurableProps.forEach(prop => {
      config[status][prop] = defaults[prop]?.[status];
    });
  });

  return config;
}

// 使用示例
const finalConfig = buildStatusConfig([200, 404], defaultDict);
// 输出结果:
// {
//   200: { description: '请求成功', model: { result: {} } },
//   404: { description: '资源不存在', model: null }
// }

4. 新增属性时的适配流程

当在 DetailedDefaultsObject 中新增属性(比如 code?: string),只需完成三步:

  1. 在 configurableProps 数组(或装饰器元数据)中添加 'code'
  2. 在 defaultDict 中添加 code 对应的各状态默认值
  3. TypeScript 会自动校验新增属性的类型合法性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 08:40:42