Jest to zgodne z projektem (Wytłumaczę dlaczego to jest dobry projekt wkrótce). Spec mówi (w sekcji 3.6.3, skrócone dla jasności):
Typ S jest przypisane do typu T i T jest przypisane z S, jeśli jedno z poniższych stwierdzeń jest prawdziwe ...
W tym przypadku, testujemy jeśli () => stringjest przypisane do () => void. Więc albo stringmusi być przypisane do void(nie jest), czy voidma być void(jest).
W efekcie, zasada jest tu masz prawo wyrzucić wartości zwracanej , co jest zgodne ze sposobem np C ++ traktuje voidw rozdzielczości matrycy.
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?
Kiedy ograniczyć typ changesię (widget) => void, robimy to tak, że można przekazać decrementWidgetHeightjako drugi argument, mimo że ma wartość powrotną, ale nadal upewniając się, że gdy piszemy ciało applyToManyWidgets, nie przypadkowo użyć wartość powrócić changew dowolnym miejscu.
Należy pamiętać, że voidjest jeszcze inny niż anybo to niedozwolonych:
function f() { }
var x = f(); // Disallowed, f() is of type 'void'