Je suis tout nouveau dactylographié et j'ai deux classes. Dans la classe des parents, j'ai:
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;
};
}
}
Dans la classe enfant, j'ai:
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);
}
}
ShowMore et ShowLess me donnent tous les deux l'erreur "Impossible d'appeler une expression dont le type n'a pas de signature d'appel."
Mais la fonction que setProp retourne a-t-elle une signature d'appel, je pense? Je pense que je ne comprends pas quelque chose d'important sur les typages de fonctions, mais je ne sais pas ce que c'est.
Merci!
javascript
angularjs
typescript
types
Justin
la source
la source
togglrBody
ne devrait pas être une chaîne, puisque vous voulez que ce soit une fonction<T>(val: T) => T
Réponses:
La fonction qu'elle renvoie a une signature d'appel, mais vous avez dit à Typescript d'ignorer complètement cela en ajoutant
: any
sa signature.Ne fais pas ça.
la source
public toggleBody: boolean;
àpublic toggleBody: any;
cela fonctionne.this.toggleBody
devoir retournerboolean
, mais ce n'est pas cohérent avec la valeur de retoursetProp
que vous lui avez attribuée. Vous semblez simplement lancer des types au hasard sans penser à ce que vous voulez réellement envoyer et renvoyer.Dans votre code:
Vous avez
public toggleBody: string;
. Vous ne pouvez pas appelerstring
une fonction. D'où des erreurs sur:this.toggleBody(true);
etthis.toggleBody(false);
la source
Décomposons ceci:
L'erreur dit
Le code:
Le problème est dans cette ligne
public toggleBody: string;
etc'est en relation avec ces lignes:
Votre dicton
toggleBody
est unstring
mais alors vous le traitez comme quelque chose qui a uncall signature
(c'est-à-dire la structure de quelque chose qui peut être appelé: lambdas, proc, fonctions, méthodes, etc. En JS, fonction juste tho.). Vous devez changer la déclaration pour êtrepublic toggleBody: (arg: boolean) => boolean;
.Détails supplémentaires:
"invoke" signifie votre appel ou l'application d'une fonction.
"une expression" en Javascript est essentiellement quelque chose qui produit une valeur, donc
this.toggleBody()
compte comme une expression."type" est déclaré sur cette ligne
public toggleBody: string
"manque une signature d'appel" c'est parce que vous essayez d'appeler quelque chose
this.toggleBody()
qui n'a pas de signature (c'est-à-dire la structure de quelque chose qui peut être appelé: lambdas, proc, fonctions, méthodes, etc.) qui peut être appelée. Vous avez dit quethis.toggleBody
c'est quelque chose qui agit comme une corde.En d'autres termes, l'erreur dit
la source
Je pense que ce que tu veux c'est:
Le changement important est dans
setProp
(c'est-makePropSetter
à- dire dans le nouveau code). Ce que vous faites vraiment là-bas, c'est dire: c'est une fonction, qui munie d'un nom de propriété, retournera une fonction qui vous permet de changer cette propriété.Le
<T>
surmakePropSetter
vous permet de verrouiller cette fonction pour un type spécifique. Le constructeur<boolean>
de la sous-classe est en fait facultatif. Puisque vous affectez àtoggleBody
, et que le type est déjà entièrement spécifié, le compilateur TS pourra le résoudre lui-même.Ensuite, dans votre sous-classe, vous appelez cette fonction, et le type de retour est maintenant correctement compris comme une fonction avec une signature spécifique. Naturellement, vous devrez
toggleBody
respecter cette même signature.la source
Cela signifie que vous essayez d'appeler quelque chose qui n'est pas une fonction
la source
Ajoutez un type à votre variable, puis revenez.
Par exemple:
=> La partie importante est l'ajout de la chaîne [] type etc:
la source
J'ai eu le même message d'erreur. Dans mon cas, j'avais mélangé par inadvertance la
export default function myFunc
syntaxe ES6 avecconst myFunc = require('./myFunc');
.L'utilisation à la
module.exports = myFunc;
place a résolu le problème.la source
Cette erreur peut être provoquée lorsque vous demandez une valeur à quelque chose et que vous mettez des parenthèses à la fin, comme s'il s'agissait d'un appel de fonction, mais la valeur est correctement récupérée sans mettre fin aux parenthèses. Par exemple, si vous accédez à une propriété «get» dans Typescript.
la source