Αυτό οφείλεται στη σχεδίαση (θα εξηγήσω γιατί είναι καλό σχεδιασμό σύντομα). Η spec λέει (στο τμήμα 3.6.3, συντομευμένη για λόγους σαφήνειας):
Ένας τύπος S είναι αποδιδόμενο σε μία τύπου Τ, και Τ είναι εκχωρητέο από S, εάν ένα από τα παρακάτω είναι αλήθεια ...
Σε αυτή την περίπτωση, δοκιμάζουμε αν () => stringμπορεί να αντιστοιχηθεί () => void. Έτσι, είτε stringθα πρέπει να εντάσσονται σε void(δεν είναι), ή voidπρέπει να είναι void(είναι).
Στην πραγματικότητα, ο κανόνας εδώ έχετε τη δυνατότητα να πετάξουν την τιμή επιστροφής , το οποίο είναι σύμφωνο με το πώς π.χ. C ++ αντιμετωπίζει voidστο ψήφισμά πρότυπο.
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?
Όταν περιορίζουν το είδος της changeνα είναι (widget) => void, είμαστε καθιστώντας έτσι ώστε να μπορείτε να περάσετε decrementWidgetHeightμε το δεύτερο επιχείρημα παρά το γεγονός ότι έχει μια τιμή επιστροφής, αλλά εξακολουθούν να διασφαλίσουμε ότι όταν γράφουμε το σώμα της applyToManyWidgets, δεν χρησιμοποιούμε τυχαία το επιστρέψει την αξία του changeπουθενά.
Σημειώστε ότι voidεξακολουθεί να είναι διαφορετική από ό, τι any, γιατί αυτό είναι αμιγής:
function f() { }
var x = f(); // Disallowed, f() is of type 'void'