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),只需完成三步:
- 在
configurableProps数组(或装饰器元数据)中添加'code' - 在
defaultDict中添加code对应的各状态默认值 - TypeScript 会自动校验新增属性的类型合法性
内容的提问来源于stack exchange,提问作者Yuri Silva
相关产品推荐
相关产品推荐

