Toto chování je záměrné (budu vysvětlovat, proč je to dobrý návrh krátce). Spec říká (v kapitole 3.6.3, zkrácenou kvůli přehlednosti):
Typ S je převoditelná na typu T a T je přiřaditelná z S, je-li jeden z následujících je pravda ...
V tomto případě budeme testovat, jestli () => stringje přiřaditelná k () => void. Takže buď stringmusí být převoditelná na void(není), nebo voidmusí být void(je).
Ve skutečnosti, pravidlo je zde máte možnost vyhodit návratovou hodnotu , která je v souladu s tím, jak například C ++ zachází voidv rozlišení šablony.
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?
Když jsme se omezit typ changebýt (widget) => void, děláme to tak, že můžete předat decrementWidgetHeightjako druhý argument, i když to má návratovou hodnotu, ale ještě ujistit, že když budeme psát tělo applyToManyWidgets, nemáme náhodou používat vrátit hodnoty changekdekoli.
Všimněte si, že voidje stále jiná, než anyproto, že se jedná Neoprávněné:
function f() { }
var x = f(); // Disallowed, f() is of type 'void'