Soy nuevo en mecanografiado y tengo dos clases. En la clase de 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 la función que devuelve setProp TIENE una firma de llamada, creo. Creo que estoy malinterpretando algo importante sobre la tipificación de funciones, pero no sé qué es.
¡Gracias!
javascript
angularjs
typescript
types
Justin
fuente
fuente
togglrBody
no debe ser una cadena, ya que quieres que sea una función<T>(val: T) => T
Respuestas:
La función que devuelve tiene una firma de llamada, pero le dijo a TypeScript que lo ignorara por completo agregando
: any
su firma.No hagas eso.
fuente
public toggleBody: boolean;
apublic toggleBody: any;
su funcionamiento.this.toggleBody
debería regresarboolean
, pero eso no es consistente con el valor de retornosetProp
que le ha asignado. Parece que estás introduciendo tipos al azar sin pensar en lo que realmente quieres enviar y devolver.En tu código:
Tienes
public toggleBody: string;
. No puede llamar astring
como función. De ahí errores en:this.toggleBody(true);
ythis.toggleBody(false);
fuente
Analicemos esto:
El error dice
El código:
El problema está en esta línea
public toggleBody: string;
ysu relación con estas líneas:
Tu dicho
toggleBody
es unstring
pero luego lo tratas como algo que tiene uncall signature
(es decir, la estructura de algo que se puede llamar: lambdas, proc, funciones, métodos, etc. En JS simplemente funciona aunque). Necesita cambiar la declaración para que seapublic toggleBody: (arg: boolean) => boolean;
.Detalles adicionales:
"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."tipo" se declara en esta línea
public toggleBody: string
"carece de una firma de llamada" esto se debe a que estás intentando 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 llamar. Dijiste quethis.toggleBody
es algo que actúa como una cuerda.En otras palabras, el error es decir
fuente
Creo que lo que quieres es:
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 si se le proporciona un nombre de propiedad, devolverá una función que le permite cambiar esa propiedad.El
<T>
encendido lemakePropSetter
permite bloquear esa función en un tipo específico. El<boolean>
en el constructor de la subclase es en realidad opcional. Dado que está asignando atoggleBody
, 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, deberás
toggleBody
respetar esa misma firma.fuente
Significa que estás intentando llamar a algo que no es una función.
fuente
Agregue un tipo a su variable y luego regrese.
P.ej:
=> La parte importante es agregar el tipo de cadena [], etc.
fuente
Tuve el mismo mensaje de error. En mi caso, sin darme cuenta había mezclado la
export default function myFunc
sintaxis de ES6 conconst myFunc = require('./myFunc');
.Usar en su
module.exports = myFunc;
lugar resolvió el problema.fuente
Este error se puede producir cuando solicita un valor de algo y pone paréntesis al final, como si fuera una llamada a una función, pero el valor se recupera correctamente sin terminar el paréntesis. Por ejemplo, si lo que está accediendo es una propiedad 'obtener' en Typecript.
fuente