Je comprends le message d'erreur:
Le type '() => void' n'est pas attribuable au type '() => {}'
Eh bien, en quelque sorte, cela me dit qu'il y a un problème de casting de type. Cependant, je ne peux pas comprendre pourquoi le compilateur pense que les types ne sont pas les mêmes.
L'arrière-plan du code est que j'ai une classe TypeScript qui reçoit une fonction et la stocke ensuite en tant que membre. Je veux pouvoir initialiser le membre avec une fonction 'noop' vide afin qu'il n'ait pas à la vérifier nulle avant utilisation.
J'ai réussi à réduire le problème à l'exemple de code de test suivant:
export class Test {
private _noop: () => {};
constructor(
) {
this._noop = () => { }; //I guess the compiler thinks this is returning in a new empty object using the json syntax
this._noop = this.noop; //I would have thought this shoud definitely work
this._noop = () => undefined; //This does works
}
public noop(): void {
//Nothing to see here...
}
}
Les trois instructions dans le constructeur sont toutes destinées à faire le même travail: initialiser le membre avec une fonction no operation. Cependant, seule la dernière instruction fonctionne:
this._noop = () => undefined;
Les deux autres instructions produisent l'erreur de compilation.
Est-ce que quelqu'un sait pourquoi le compilateur ne semble pas correspondre aux types?
Dans votre définition, private _noop: () => {};
_noop
est saisi comme une fonction renvoyant un objet.
Lorsque vous l'assignez en tant que this._noop = () => { };
la fonction que vous essayez d'assigner à _noop
est de type () => void
.
Si vous vouliez que _noop
soit une fonction ne retournant rien, tapez-la comme suit:
private _noop: () => void;
La définition ci-dessous signifie que _noop est une fonction qui doit renvoyer un objet (y compris undefined et null).
private _noop: () => {};
c'est égal à:
private _noop: () => Object;
vous pouvez faire fonctionner les trois instructions avec:
private _noop: () => any;
ou la première déclaration fonctionnera avec les deux:
this._noop = () => ({});
this._noop = () => { return {} };