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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 10:55:25