AngularX TS错误无法调用类型缺少调用签名的表达式[关闭]

Posted

技术标签:

【中文标题】AngularX TS错误无法调用类型缺少调用签名的表达式[关闭]【英文标题】:AngularX TS error Cannot invoke an expression whose type lacks a call signature [closed] 【发布时间】:2018-06-09 15:33:51 【问题描述】:

我正在创建这样的组件,但在 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 有关。请解释。我不这么认为。

【问题讨论】:

检查 ngOnInit() 中的 console.log(this.chartInput); Error: Cannot invoke an expression whose type lacks a call signature的可能重复 @orangespark nope.. 我会通过的。请比较它并标记重复。错误是一样的。但不同的用例。 @Ajay ...我想为此构建..你认为.?? 您在代码中使用的这个 sn-p 是否准确? 【参考方案1】:

已知在使用联合类型 (Microsoft/TypeScript - Issue #7294) 时会发生这种情况。如issue comment 中所述:

目前这是设计使然,因为我们在获取联合类型的成员时不合成交叉调用签名——只有相同的调用签名出现在联合类型上。

在您的情况下,ChartInputMultiChartInput 没有兼容的签名,因为它们都有独特的属性;即ChartInputvalue: number,而MultiChartInputseries: 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

【讨论】:

谢谢。我实际上已经找到了修复 1 并解决了这个问题。但我真的很想检查它是否可以以其他方式工作。感谢修复 2 和微软关于此事的文档

以上是关于AngularX TS错误无法调用类型缺少调用签名的表达式[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

错误 TS2349:无法调用其类型缺少调用签名的表达式

TS/SFC/RenderProp:无法调用类型缺少调用签名的表达式

TS2351:不能将“new”与类型缺少调用或构造签名的表达式一起使用。角度 8

类型数组的打字稿错误:- 无法调用其类型缺少调用签名的表达式

无法调用其类型缺少调用签名的表达式...没有兼容的调用签名

Typescript中的“无法调用类型缺少调用签名的表达式”?