我知道以前会问这些类型的问题,但我仍然不清楚。
我是初学者,我正在尝试学习打字稿中的导入和导出。所以我写了下面的代码。请仔细看看。
我有三个文件: -
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();
我该如何解决这个问题?这个错误究竟意味着什么?
答案 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;