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

TypeScript遍历类对象属性赋值报错:类型'number'无法赋值给'()=>number'

解决TypeScript类型错误:Type 'number' is not assignable to type '() => number'

问题代码

var roundedMachineData = new RoundedMachineData();

for (var prop in roundedMachineData) {
  roundedMachineData[prop as keyof RoundedMachineData] = 0;
}

export class RoundedMachineData {
  public constructor(init?: Partial<RoundedMachineData>) {
      Object.assign(this, init);
  }
  public running: number = NaN;
  public idle: number = NaN;
  public estop: number = NaN;
  public alarm: number = NaN;
  public operatorCall: number = NaN;
  public maintenance: number = NaN;
  public feedHold: number = NaN;
  public disconnected: number = NaN;
  public singleBlock: number = NaN;
}

运行上述代码时出现错误:Type 'number' is not assignable to type '() => number',但RoundedMachineData类的所有属性均为number类型。

错误原因

for...in循环会遍历对象原型链上的所有可枚举属性,包括继承自Object原型的方法(比如toString、valueOf等)。这些方法的类型是函数(() => number或其他函数类型),当你尝试给它们赋值0(number类型)时,就会触发类型不匹配错误。

解决方法

方法1:用hasOwnProperty过滤原型链属性

在循环内添加判断,只处理实例自身的属性:

var roundedMachineData = new RoundedMachineData();

for (var prop in roundedMachineData) {
  // 仅处理实例自身的属性,排除原型链上的方法
  if (roundedMachineData.hasOwnProperty(prop)) {
    roundedMachineData[prop as keyof RoundedMachineData] = 0;
  }
}

export class RoundedMachineData {
  public constructor(init?: Partial<RoundedMachineData>) {
      Object.assign(this, init);
  }
  public running: number = NaN;
  public idle: number = NaN;
  public estop: number = NaN;
  public alarm: number = NaN;
  public operatorCall: number = NaN;
  public maintenance: number = NaN;
  public feedHold: number = NaN;
  public disconnected: number = NaN;
  public singleBlock: number = NaN;
}

方法2:用Object.keys遍历实例属性

Object.keys只会返回对象自身的可枚举属性名数组,直接遍历这个数组即可避开原型链问题:

var roundedMachineData = new RoundedMachineData();

// 仅遍历实例自身的属性键
Object.keys(roundedMachineData).forEach(prop => {
  roundedMachineData[prop as keyof RoundedMachineData] = 0;
});

export class RoundedMachineData {
  public constructor(init?: Partial<RoundedMachineData>) {
      Object.assign(this, init);
  }
  public running: number = NaN;
  public idle: number = NaN;
  public estop: number = NaN;
  public alarm: number = NaN;
  public operatorCall: number = NaN;
  public maintenance: number = NaN;
  public feedHold: number = NaN;
  public disconnected: number = NaN;
  public singleBlock: number = NaN;
}

内容的提问来源于stack exchange,提问作者Luke Cobbs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 22:10:19