Tapuscrit: type de retour vide converti à tout type?

voix
17

Il me semble être pas en mesure de comprendre pourquoi le code suivant ne soulève pas d'erreur:

var rg: {(): void;}[] = [];
rg.push(function():string {return ;})

Je dis clairement que le type doit être un tableau de fonctions qui reviennent void, mais je pousse là une fonction qui renvoie un stringet pourtant le compilateur ne se plaint pas. Si je change la définition de rgla

var rg: {():number;}[] = [];

Le compilateur commence à se plaindre.

Est - ce un bug ou est - ce la façon dont le type de retour de vide est censé fonctionner (ie tout ce qui se passe si voidon utilise, ce qui en fait la même chose que le type de retour any)?

Créé 06/10/2012 à 17:34
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
17

C'est par la conception (je vais vous expliquer pourquoi il est bon design peu). La spécification dit (dans la section 3.6.3, abrégée pour plus de clarté):

Un type S est assignable à un type T, et T est assignable parmi S, si l'une des conditions suivantes est vraie ...

  • S et T sont des types d'objet et, pour chaque élément M en T, une des conditions suivantes est remplie:

    • M est un appel, construction ou la signature de l'index et S contient un appel, de construire ou de la signature d'indice N, où

      • le type de résultat de M est vide, ou le type de résultat de N est assignable à celle de M.

Dans ce cas, nous testons si () => stringest assignable () => void. Donc , soit stringdoit être cessible à void(ce n'est pas), ou voiddoit être void(il est).


En effet, la règle ici est que vous êtes autorisé à jeter la valeur de retour , ce qui correspond à la façon dont par exemple C ++ traite voiddans la résolution du modèle.

function decrementWidgetHeight(w: Widget): number {
    // ... returns the new height of the widget
}

function applyToManyWidgets(w: Widget[], change: (x: Widget) => void): void {
    // for each widget in the array, apply 'change' to it
}

// Later...
applyToManyWidgets(widgetsToShorten, decrementWidgetHeight); // Should be allowed?

Lorsque nous limitons le type d' changeêtre (widget) => void, nous faisons en sorte que vous pouvez passer decrementWidgetHeightcomme second argument , même si elle a une valeur de retour, mais toujours faire en sorte que lorsque nous écrivons le corps applyToManyWidgets, nous ne l' utilisons pas accidentellement la retour valeur de changenulle part.

Notez que voidest toujours différente de celle anyparce que c'est inadmissible:

function f() { }
var x = f(); // Disallowed, f() is of type 'void'
Créé 06/10/2012 à 22:06
source utilisateur

voix
0

Cela ressemble à un bug. Vous devriez ouvrir un nouvel élément de travail pour la question

Créé 06/10/2012 à 18:38
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more