これは仕様によるものです (これが優れた設計である理由については後ほど説明します)。仕様には次のように記載されています(セクション3.6.3では、明確にするために要約されています):
次のいずれかが真の場合、型 S は型 T に代入可能であり、T は S から代入可能です...
この場合、() => string
が に割り当て可能かどうかをテストしています() => void
。したがって、割り当て可能でなければならない (string
割り当てられvoid
ない) か、割り当て可能でなければならない (割り当てられる) 必要void
がありvoid
ます。
事実上、ここでの規則は、戻り値を破棄することが許可されているということですvoid
。これは、たとえば C++がテンプレート解決で処理する方法と一致しています。
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
と、戻り値があっても 2 番目の引数として(widget) => void
渡すことができるようになりますが、 の本体を記述するときに誤って を使用しないようにします。どこでも戻り値。decrementWidgetHeight
applyToManyWidgets
change
これは許可されていないため、とvoid
はまだ異なることに注意してください。any
function f() { }
var x = f(); // Disallowed, f() is of type 'void'