Dit is zo ontworpen (Ik zal uitleggen waarom het goed ontwerp binnenkort). De spec zegt (in paragraaf 3.6.3, verkorte voor de duidelijkheid):
Een type S is toewijsbaar aan een type T, en T toewijsbare uit S, als een van de volgende waar ...
In dit geval, testen we of () => stringis toewijsbaar aan () => void. Dus ofwel stringheeft toewijsbaar te zijn void(het is niet), of voidmoet zijn void(het is).
In feite, de regel is hier mag je weggooien de return waarde , die in overeenstemming is met de manier waarop bijvoorbeeld C ++ traktaties voidin template resolutie.
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?
Als we beperken het type changete zijn (widget) => void, maken we het zo dat je kan passeren decrementWidgetHeightals tweede argument, ook al heeft het een return waarde, maar nog steeds om ervoor te zorgen dat wanneer we het lichaam van schrijven applyToManyWidgets, wij niet per ongeluk gebruik maken van de terugkeer waarde van changeoveral.
Merk op dat voidis toch anders dan anyomdat dit niet is toegestaan:
function f() { }
var x = f(); // Disallowed, f() is of type 'void'