web-dev-qa-db-fra.com

Le type '() => void' n'est pas attribuable au type '() => {}'

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?

8
Tom Maher

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;
8
Saravana

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 {} };
2
Val