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:
-
El error dice
No se puede invocar una expresión cuyo tipo carece de una firma de llamada.
-
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);
- 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.