typings type node javascript angularjs typescript types

javascript - type - Error: no se puede invocar una expresión cuyo tipo carece de una firma de llamada



typescript type definitions (7)

"No se puede invocar una expresión cuyo tipo carece de una firma de llamada".

En su código:

class Post extends Component { public toggleBody: string; constructor() { this.toggleBody = this.setProp(''showFullBody''); } public showMore(): boolean { return this.toggleBody(true); } public showLess(): boolean { return this.toggleBody(false); } }

Tienes public toggleBody: string; . No se puede llamar a una string como una función. De ahí los errores en: this.toggleBody(true); y this.toggleBody(false);

Soy nuevo en el mecanografiado y tengo dos clases. En la clase para padres tengo:

abstract class Component { public deps: any = {}; public props: any = {}; public setProp(prop: string): any { return <T>(val: T): T => { this.props[prop] = val; return val; }; } }

En la clase infantil tengo:

class Post extends Component { public toggleBody: string; constructor() { this.toggleBody = this.setProp(''showFullBody''); } public showMore(): boolean { return this.toggleBody(true); } public showLess(): boolean { return this.toggleBody(false); } }

Tanto showMore como ShowLess me dan el error "No se puede invocar una expresión cuyo tipo carece de una firma de llamada".

Pero creo que la función que devuelve setProp ¿TIENE una firma de llamada? Creo que no entiendo algo importante sobre los tipos de funciones, pero no sé qué es.

¡Gracias!


Agregue un tipo a su variable y luego regrese.

P.ej:

const myVariable : string [] = [''hello'', ''there'']; const result = myVaraible.map(x=> { return { x.id } });

=> Parte importante es agregar el tipo de cadena [], etc.


Analicemos esto:

  1. El error dice

    No se puede invocar una expresión cuyo tipo carece de una firma de llamada.

  2. El código:

El problema está en esta línea public toggleBody: string; Y

es relación con estas líneas:

... return this.toggleBody(true); ... return this.toggleBody(false);

  1. El resultado:

Su dicho toggleBody es una string pero luego lo trata como algo que tiene una call signature (es decir, la estructura de algo que se puede llamar: lambdas, proc, funciones, métodos, etc. En JS simplemente funciona). public toggleBody: (arg: boolean) => boolean; cambiar la declaración para que sea public toggleBody: (arg: boolean) => boolean; .

Detalles extra:

"invocar" significa su llamada o aplicación de una función.

"una expresión" en Javascript es básicamente algo que produce un valor, por lo que this.toggleBody() cuenta como una expresión.

"type" se declara en esta línea public toggleBody: string

"carece de una firma de llamada" esto se debe a que está tratando de llamar a algo this.toggleBody() que no tiene firma (es decir, la estructura de algo que se puede llamar: lambdas, proc, funciones, métodos, etc.) que se puede llamado. Dijiste this.toggleBody es algo que actúa como una cadena.

En otras palabras, el error dice

No se puede llamar a una expresión (this.toggleBody) porque su tipo (: cadena) carece de una firma de llamada (bc tiene una firma de cadena).


Creo que lo que quieres es:

abstract class Component { public deps: any = {}; public props: any = {}; public makePropSetter<T>(prop: string): (val: T) => T { return function(val) { this.props[prop] = val return val } } } class Post extends Component { public toggleBody: (val: boolean) => boolean; constructor () { super() this.toggleBody = this.makePropSetter<boolean>(''showFullBody'') } showMore (): boolean { return this.toggleBody(true) } showLess (): boolean { return this.toggleBody(false) } }

El cambio importante está en setProp (es decir, makePropSetter en el nuevo código). Lo que realmente está haciendo allí es decir: esta es una función, que se proporciona con un nombre de propiedad, devolverá una función que le permite cambiar esa propiedad.

El <T> en makePropSetter permite bloquear esa función en un tipo específico. El <boolean> en el constructor de la subclase es realmente opcional. Dado que está asignando a toggleBody , y que ya tiene el tipo completamente especificado, el compilador de TS podrá resolverlo por sí solo.

Luego, en su subclase, llama a esa función, y el tipo de retorno ahora se entiende correctamente como una función con una firma específica. Naturalmente, necesitará que toggleBody respete esa misma firma.


La función que devuelve tiene una firma de llamada, pero usted le dijo a Typecript que lo ignore por completo al agregar : any en su firma.

No hagas eso.


Significa que estás tratando de llamar a algo que no es una función

const foo = ''string'' foo() // error


Tuve el mismo mensaje de error. En mi caso, mezclé inadvertidamente la sintaxis export default function myFunc ES6 con const myFunc = require(''./myFunc''); .

Usando module.exports = myFunc; en su lugar resolvió el problema.