Typescript:无法调用类型缺少调用签名的表达式。 “号码”类型没有兼容的呼叫签名

时间:2018-04-11 10:55:29

标签: typescript

我知道以前会问这些类型的问题,但我仍然不清楚。

我是初学者,我正在尝试学习打字稿中的导入和导出。所以我写了下面的代码。请仔细看看。

我有三个文件: -

 1.animal.ts  
 2.bird.ts 
 3.application.ts

Animal.ts: -

export class Animal {
    name:string
    age:number
    constructor(name:string,age:number){
        this.name=name;
        this.age=age
    }
    
    sleep(){
        console.log("I do sleep")
    }

    eat(){
        console.log("I do eat")
    }
}

bird.ts

import {Animal} from "./animal"

export class Bird extends Animal{

    constructor(name:string,age:number){
        super(name,age)
    }

    fly(){
        console.log("I can fly also")
    }
}

aplication.ts

import { Animal } from "./animal"
import { Bird } from "./bird"

class Application {

    constructor() {
        console.log("Hi i am a bird !!")
    }
}

var animal = new Animal("Rhino", 10);
var bird = new Bird("Pigeon", 3)

animal.age();   //Cannot invoke an expression whose type lacks a call signature. Type 'Number' has no compatible call signatures
animal.name();  //Cannot invoke an expression whose type lacks a call signature. Type 'String' has no compatible call signatures.

bird.age();     //Cannot invoke an expression whose type lacks a call signature. Type 'Number' has no compatible call signatures
bird.fly();
bird.sleep();

我该如何解决这个问题?这个错误究竟意味着什么?

3 个答案:

答案 0 :(得分:6)

bird.age()不起作用,因为它是一个数字。 console.log(bird.age)可以使用。

bird.fly()有效,因为它是一个函数。

所有其他问题的类似模式。

答案 1 :(得分:3)

您的问题不在于导入或导出,看起来没问题。这样:

Cannot invoke an expression whose type lacks a call signature. Type 'Number' has no compatible call signatures

说了一切。您使用age(),因此您使用年龄就好像它是一个函数(具有调用签名)。但年龄是一个数字 - 你可以添加它,打印它等,但你不能“称呼”它。这就是其他线路没有失败的原因 - 你可以正确地调用它们。

答案 2 :(得分:0)

当您尝试使用括号访问类的属性时,也会发生此错误。例如,您已经在类中创建了一个属性,

private get printTemplateDetailsUrl(): string {        
      return `${this._baseHref}://getUserPrintTemplateDetailsJson`;
  } 

并且您已尝试访问该属性,

let url = this.printTemplateDetailsUrl();

因此它将给出错误,

Cannot invoke an expression whose type lacks a call signature. Type 'String' has no compatible call signatures

因此,如果您要访问该属性,则不需要尾随括号,就可以这样访问

let url = this.printTemplateDetailsUrl;