Dette er design (jeg vil forklare hvorfor det er god design kort tid). Spec sier (i seksjon 3.6.3, forkortet for klarhet):
En type S er overførbar til en type T, og T er overdras fra S, hvis en av følgende betingelser er oppfylt ...
I dette tilfellet, tester vi om () => stringer overdras til () => void. Så enten stringmå være overdras til void(det er ikke), eller voidmå være void(det er).
I praksis regelen her er at du har lov til å kaste bort returverdien , som er konsistent med hvordan f.eks C ++ behandler voidi malen oppløsning.
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?
Når vi begrense den typen changetil å være (widget) => void, gjør vi det slik at du kan passere decrementWidgetHeightsom andre argument, selv om den har en returverdi, men fortsatt gjør sikker på at når vi skriver kroppen av applyToManyWidgets, vi ikke tilfeldigvis bruke returnere verdien av changehvor som helst.
Legg merke til at voiddet fortsatt annerledes enn anyfordi dette er ikke uautorisert:
function f() { }
var x = f(); // Disallowed, f() is of type 'void'