TypeScript遍历类动态属性并修改:添加方法后报错求助
问题原因
添加test方法后,keyof TranslateEntry的联合类型包含了方法名'test'。循环遍历this时会拿到这个方法键,而你试图给它赋值字符串,但test是函数类型,类型不兼容导致报错。
解决方案
方案1:遍历过滤方法属性
在循环里判断当前属性是否为字符串类型,只处理这类属性:
export class TranslateEntry { datum: string = 'Datum'; sport: string = 'Sport'; leistung: string = 'Leistung'; einheit: string = 'Einheit'; constructor() { type ObjectKey = keyof TranslateEntry; for( let key in this ) { // 过滤掉函数类型的属性 if (typeof this[key as ObjectKey] === 'string') { this[key as ObjectKey] = "T" + this[key as ObjectKey] + "T" as typeof this[key]; } } } test() { } }
方案2:用类型工具提取仅字符串属性的键
通过条件类型提取所有值为字符串类型的键,再结合类型守卫确保类型安全:
export class TranslateEntry { datum: string = 'Datum'; sport: string = 'Sport'; leistung: string = 'Leistung'; einheit: string = 'Einheit'; constructor() { // 提取所有值为string类型的键 type StringKey = { [K in keyof TranslateEntry]: TranslateEntry[K] extends string ? K : never }[keyof TranslateEntry]; for( let key in this ) { if (key satisfies StringKey) { this[key] = "T" + this[key] + "T"; } } } test() { } }
方案3:单独维护属性列表
如果类的字符串属性固定,直接定义属性名数组,只遍历这些已知属性:
export class TranslateEntry { datum: string = 'Datum'; sport: string = 'Sport'; leistung: string = 'Leistung'; einheit: string = 'Einheit'; // 维护字符串属性的键列表 private readonly stringKeys = ['datum', 'sport', 'leistung', 'einheit'] as const; constructor() { for( let key of this.stringKeys ) { this[key] = "T" + this[key] + "T"; } } test() { } }
内容的提问来源于stack exchange,提问作者T-Rex
相关产品推荐
相关产品推荐

