Closed. This question needs debugging details。它当前不接受答案。
想改善这个问题吗?更新问题,以便将其作为on-topic用于堆栈溢出。
2年前关闭。
Improve this question
我正在创建这样的组件,并且在ng serve / building上遇到错误。
请勿与某些评论者似乎认为的控制台错误混淆。
预期的行为是针对代码的构建和运行。
在
任何解决的帮助表示赞赏。
如果有人认为这与此question有关。请解释。我不这么认为。
demo of fix 1
...或强制转换
demo of fix 2
想改善这个问题吗?更新问题,以便将其作为on-topic用于堆栈溢出。
2年前关闭。
Improve this question
我正在创建这样的组件,并且在ng serve / building上遇到错误。
请勿与某些评论者似乎认为的控制台错误混淆。
预期的行为是针对代码的构建和运行。
TS error TS2349: Cannot invoke an expression whose type lacks a call signature
在
ngOnInit()
中的foreach函数中 import { Component, OnInit, Input } from '@angular/core';
import { ChartInput, MultiChartInput, ChartColorScheme } from "@shared/models/chart-input";
@Component({
selector: 'chart-legend',
templateUrl: './chart-legend.component.html',
styleUrls: ['./chart-legend.component.css']
})
export class ChartLegendComponent implements OnInit {
@Input()
public chartInput: ChartInput[] | MultiChartInput[];
@Input()
public legendColors: ChartColorScheme;
public legends: Map<string, string> = new Map<string, string>();
constructor() { }
ngOnInit() {
this.chartInput.forEach(
(item, index) => {
this.legends.set(item.name, this.legendColors.domain[index]);
});
}
}
export class ChartInput {
name: string;
value: number;
}
export class MultiChartInput {
name: string;
series: ChartInput[];
}
export class ChartColorScheme {
domain: string[];
}
任何解决的帮助表示赞赏。
如果有人认为这与此question有关。请解释。我不这么认为。
最佳答案
使用联合类型(Microsoft/TypeScript - Issue #7294)时会发生这种情况。如issue comment中所述:
在您的情况下,ChartInput
和MultiChartInput
不具有兼容的签名,因为它们各自具有唯一的属性。即ChartInput
具有value: number
,而MultiChartInput
具有series: ChartInput[]
。您可以通过注释掉那些属性并查看错误是否消失(demo of experiment)来快速进行测试。
要在保持类型安全的同时解决该错误,请将chartInput
的类型更改为(ChartInput | MultiChartInput)[]
:
class ChartLegendComponent implements OnInit {
public chartInput: (ChartInput | MultiChartInput)[];
...
}
demo of fix 1
...或强制转换
this.chartInput
:(this.chartInput as (ChartInput | MultiChartInput)[])
.forEach(
(item, index) => {
this.legends.set(item.name, this.legendColors.domain[index]);
});
}
demo of fix 2
09-18 19:02