2017-07-28 4 views
0

Je comprends le message d'erreur:Type '() => vide' est incessible à taper '() => {}

Type '() => vide' est incessible à taper'() => {} '

Eh bien, en quelque sorte, il me dit qu'il y a un problème de moulage de type. Cependant, je ne peux pas comprendre pourquoi le compilateur pense que les types ne sont pas les mêmes.

Le fond du code est que j'ai une classe de type qui reçoit une fonction et la stocke ensuite en tant que membre. Je veux être en mesure d'initialiser le membre avec une fonction vide 'noop' afin qu'il ne doive pas vérifier null avant utilisation.

J'ai réussi à réduire problème à le code de test exemple 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 déclarations du constructeur sont tous destinés à faire le même travail: initialiser le membre avec aucune fonction de fonctionnement. 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?

Répondre

1

Dans votre définition private _noop:() => {};_noop est tapé comme une fonction retournant un objet.

Lorsque vous l'attribuez sous la forme this._noop =() => { };, la fonction que vous essayez d'affecter à _noop est de type () => void.

Si vous voulez _noop être rien retour de la fonction puis tapez comme:

private _noop:() => void; 
+0

Merci qui a du sens. –

1

La définition ci-dessous signifie que _noop est une fonction qui doit retourner un objet (y compris undefined et null).

private _noop:() => {}; 

il est égal à:

private _noop:() => Object; 

vous pouvez faire trois déclarations de travail avec:

private _noop:() => any; 

ou la première déclaration travaillera avec ces deux:

this._noop =() => ({}); 
this._noop =() => { return {} }; 
+0

Ah génial ... ça fait plus de sens. Je n'avais pas réalisé que le type de membre avait été déclaré incorrectement. Je pensais que je le déclarais vide. Merci d'avoir expliqué cela. Ma question de suivi aurait été de savoir comment déclarer un type qui est une fonction qui renvoie void. Cependant, il semble que @Saravana l'ait déjà fait. –