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
相关产品推荐
相关产品推荐

