Closed. This question needs debugging details。它当前不接受答案。












想改善这个问题吗?更新问题,以便将其作为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中所述:



在您的情况下,ChartInputMultiChartInput不具有兼容的签名,因为它们各自具有唯一的属性。即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