如何在TypeScript中获取类属性名并作为静态变量使用?
解决方案
首先修正你原Car类中的错误:构造函数里的this.number = number是笔误,应该改为this.year = year,否则会导致类属性不匹配。
针对你的需求,推荐两种简洁且类型安全的方案,既能避免硬编码属性名,又能获得TypeScript的自动提示:
方案一:静态只读属性(手动维护,类型约束)
直接在类中定义与实例属性同名的静态只读属性,赋值为对应的属性名字符串。TypeScript会自动进行类型校验,新增实例属性时,若未同步添加静态属性,后续使用时会触发类型报错,提醒你同步维护。
class Car { model: string; year: number; price: string; // 静态只读属性,与实例属性一一对应 static readonly model = 'model'; static readonly year = 'year'; static readonly price = 'price'; constructor(model: string, year: number, price: string) { this.model = model; this.year = year; // 修正原笔误 this.price = price; } } // 使用示例:校验JSON数据 function validateCarData(data: unknown): boolean { if (typeof data !== 'object' || data === null) return false; // 直接通过静态属性获取属性名,无需硬编码 return ( Car.model in data && Car.year in data && Car.price in data ); }
方案二:自动挂载静态属性(减少手动重复)
通过TypeScript的类型工具和辅助逻辑,自动给类挂载静态属性,只需维护一个属性名数组(有类型约束),新增属性时数组会触发类型校验,确保同步。
class Car { model: string; year: number; price: string; constructor(model: string, year: number, price: string) { this.model = model; this.year = year; // 修正原笔误 this.price = price; } } // 定义Car类的实例属性键类型 type CarPropertyKeys = keyof Car; // 维护属性名数组,TypeScript会校验数组元素是否都是Car的合法属性 const carPropertyKeys = ['model', 'year', 'price'] as const satisfies readonly CarPropertyKeys[]; // 自动给Car类挂载静态属性 carPropertyKeys.forEach(key => { (Car as Record<string, string>)[key] = key; }); // 使用示例:校验JSON数据 function validateCarData(data: unknown): boolean { if (typeof data !== 'object' || data === null) return false; return carPropertyKeys.every(key => key in data); }
两种方案都能满足你的需求:
- 避免硬编码属性名字符串
- 获得TypeScript的自动补全提示
- 新增属性时能通过类型校验确保同步维护
内容的提问来源于stack exchange,提问作者Khanh Do
相关产品推荐
相关产品推荐

