Tapuscrit: void type de retour converti à n'importe quel type?
Je semble ne pas être en mesure de comprendre pourquoi le code suivant ne soulève pas d'erreur:
var rg: {(): void;}[] = [];
rg.push(function():string {return "";})
J'ai clairement que le type doit être un tableau de fonctions qui retournent des void
, cependant, je push il y a une fonction qui renvoie un string
et pourtant, le compilateur n'a pas à se plaindre. Si je change la définition de rg
à
var rg: {():number;}[] = [];
Le compilateur commence à se plaindre.
Est-ce un bug ou est-ce la façon dont le vide le type de retour est censé travailler (c'est à dire à tout va si void
est utilisé, en gros faire le même type de retour any
)?
Vous devez vous connecter pour publier un commentaire.
C'est par la conception (je vais vous expliquer pourquoi il est bon de conception peu de temps). La spec dit (dans la section 3.6.3, abrégée pour plus de clarté):
Dans ce cas, nous sommes en train de tester si
() => string
est assignable à() => void
. Donc, soitstring
doit être assignable àvoid
(n'est pas), ouvoid
doit êtrevoid
(c'est).En effet, ici, la règle est vous êtes autorisé à jeter la valeur de retour, ce qui est cohérent avec la façon dont par exemple C++ traite
void
dans le modèle de résolution.Lorsque nous contraindre le type de
change
être(widget) => void
, nous faisons en sorte que vous pouvez passerdecrementWidgetHeight
comme deuxième argument, même si elle a une valeur de retour, mais toujours s'assurer que lorsque nous écrire le corps deapplyToManyWidgets
, nous n'avons pas accidentellement utiliser la valeur de retour dechange
n'importe où.Noter que
void
est encore différent deany
parce que c'est unallowed:var rg: {(): void;}[] = []; rg.push(function():string {return "";}) var x = rg[0]();
dans le Tapuscrit de terrain de jeu pour voir le comportement dans l'action. Changementvoid
àstring
et il va permettre le retour de la valeur à être utilisé.Qui ressemble à un bug. Vous devriez ouvrir un nouvel élément de travail pour la question