Tapuscrit décorateur rapports “Impossible de résoudre la signature de la classe décorateur, lorsqu'il est appelé en tant qu'expression”
@xxx("xxx")
class A{
msg:string
constructor(msg:string) {
this.msg = msg
}
print() {
console.log(this.msg)
}
}
function xxx(arg:string) {
function f(target) {
function ff(msg: string) {
return new target(arg + ":" + msg)
}
return ff
}
return f
}
let a = new A("hellow")
a.print()
Lors de la compilation, il signale:
décorateur.ts(1,1): erreur TS1238: Impossible de résoudre la signature de la classe décorateur, lorsqu'il est appelé comme une expression.
Type '(msg: string) => tout' n'est pas cessible de type 'void'.
Mais le js généré bien exécuté. Je ne sais pas pourquoi le message d'erreur.
assurez-vous également que vous appelez
Comme de l'ACIER a suggéré,,, C'est généralement la raison pour laquelle vous obtenez une erreur.
@Input()
avec la parenthèse ()
depuis sa fonction.Comme de l'ACIER a suggéré,,, C'est généralement la raison pour laquelle vous obtenez une erreur.
OriginalL'auteur cloud | 2016-04-06
Vous devez vous connecter pour publier un commentaire.
Le compilateur s'attend votre décorateur d'annuler ou de renvoyer une valeur qui est compatible avec les A. Il voit que vous retournez un
(msg:any) => any
, mais ne peut pas tirer la conclusion que cette fonction est compatible avec A.Si vous voulez vous débarrasser de l'erreur, vous pouvez lancer le ff à tout ce qu'elle, ou peut-être même
typeof A
de communiquer l'intention plus claire:Cela dit, il est probablement pas une bonne idée de remplacer les classes comme cela, vous devez, au moins, maintenir le constructeur:
Tapuscrit de la documentation:
Comment ce faire de façon générique? Si j'ai à jeter à la classe, je place le décorateur sur comment puis-je cast le type qui le décorateur a été placé sans codage en dur le type?
J'ai voulu faire la même chose, mais je ne pense pas que je l'ai trouvé aucune solution. Nous avons peut-être quelques nouvelles de la syntaxe maintenant, je ne sais pas. Je pense que le problème est que le type du constructeur d'une classe n'a pas de type de référence pour le type de la classe: github.com/Microsoft/TypeScript/issues/3841
J'ai donc lu les décorateurs proposition et il y a un exemple qui ne retourne rien, donc ne pas remplacer le constructeur. Qui permettrait à niveau de la classe de décorateurs qui peut prendre des paramètres à l'aide de l'usine pattern décorateur. Mais seulement si vous ne voulez pas remplacer le constructeur.
C'est certainement un énorme trou dans la proposition, bien que, et probablement la raison pour laquelle Angulaire 2 utilise encore leur annotation modèle, par opposition à l'adoption de décorateurs.
OriginalL'auteur Alex
Cela semble être résolu en ajoutant ES2016 ou ES5 comme cible dans le tsconfig.json
https://github.com/alsatian-test/alsatian/issues/344#issuecomment-290418311
OriginalL'auteur URL87