Это дизайн (я объясню, почему это хороший дизайн в ближайшее время). Спецификация говорит (в разделе 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'