這是由設計(我會解釋爲什麼它很好的設計很快)。細則中指出(在第3.6.3,刪節爲清楚起見):
A type S is assignable to a type T, and T is assignable from S, if one of the following is true...
在這種情況下,我們正在測試,如果() => 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'
我日提交的問題(http://typescript.codeplex.com/workitem/139)。 –