Ciò è di progettazione (vi spiego perché è un buon design a breve). Le specifiche dice (nella sezione 3.6.3, abbreviata per chiarezza):
Un tipo S è assegnabile a un tipo T, e T è assegnabile da S, se una delle seguenti condizioni ...
In questo caso, stiamo testando se () => stringè assegnabile a () => void. Quindi, o stringdeve essere assegnabili a void(non lo è), o voiddeve essere void(è).
In effetti, la regola qui è che si è permesso di buttare via il valore di ritorno , che è coerente con il modo ad esempio C ++ tratta voidnella risoluzione dei template.
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?
Quando abbiamo limitare il tipo di changeessere (widget) => void, stiamo facendo in modo che è possibile passare decrementWidgetHeightcome secondo argomento, anche se ha un valore di ritorno, ma ancora fare in modo che quando scriviamo il corpo di applyToManyWidgets, non usiamo accidentalmente il il valore di ritorno changeda nessuna parte.
Si noti che voidè ancora diverso da quello any, perché questo è non consentiti:
function f() { }
var x = f(); // Disallowed, f() is of type 'void'