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 ...
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'