Машинопись: невозможно вызвать выражение, тип которого не имеет сигнатуры вызова. тип "номер" не имеет совместимых подписей вызовов

Я знаю, что подобные вопросы задавали раньше, но мне все еще не ясно.

Я новичок, и я пытался изучить импорт и экспорт в машинописном тексте. Итак, я написал следующий код. Пожалуйста, взгляните на это.

У меня есть три файла: -

 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();

Как мне решить эту проблему? а что на самом деле означает эта ошибка?

Это не функции.

kimy82 11.04.2018 12:58
6
1
30 733
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

bird.age() не работает, потому что это номер. console.log(bird.age) будет работать.

bird.fly() работает, потому что это функция.

Аналогичная картина для всех остальных вопросов.

Ваша проблема не в импорте или экспорте, вроде нормально. Этот:

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

говорит само за себя. Вы используете age(), поэтому вы используете возраст, как если бы это была функция (с подписью вызова). Но возраст - это число - его можно добавить, распечатать и т. Д., Но нельзя "назвать". Вот почему другие линии не выходят из строя - вы можете вызвать по ним правильно.

Аналогичным образом, стоит помнить, что геттеры и сеттеры также являются недоступен как функция ... о которых я, возможно, ненадолго забыл. (-‸ლ)

ruffin 20.10.2018 15:07

Эта ошибка также произойдет, когда вы попытаетесь получить доступ к свойству класса с круглыми скобками. Например, вы создали свойство в таком классе, как,

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;

Другие вопросы по теме