Acest lucru este prin design (voi explica de ce este bun design în scurt timp). Spec spune (în secțiunea 3.6.3, prescurtat pentru claritate):
Un tip S este repartizabile un tip T, și T este alocabilă de la S, dacă una dintre următoarele este adevărat ...
În acest caz, suntem de testare în cazul în care () => stringeste repartizabile () => void. Deci , fie stringtrebuie să fie repartizabile void(nu este), sau voidtrebuie să fie void(este).
De fapt, regula aici este vi se permite să arunce valoarea de returnare , care este în concordanță cu modul de exemplu C ++ tratează voidîn rezoluția șablon.
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?
Când ne constrânge tipul de changea fi (widget) => void, noi o face , astfel încât să puteți trece decrementWidgetHeightca al doilea argument , chiar dacă are o valoare de întoarcere, dar încă asigurându - vă că , atunci când vom scrie corpul applyToManyWidgets, noi nu folosim accidental întoarce valoarea de changeoriunde.
Rețineți că voideste încă diferit decât pentru anycă acest lucru este nepermise:
function f() { }
var x = f(); // Disallowed, f() is of type 'void'