これは仕様によるものです (これが優れた設計である理由については後ほど説明します)。仕様には次のように記載されています(セクション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渡すことができるようになりますが、 の本体を記述するときに誤って を使用しないようにします。どこでも戻り値。decrementWidgetHeightapplyToManyWidgetschange
これは許可されていないため、とvoidはまだ異なることに注意してください。any
function f() { }
var x = f(); // Disallowed, f() is of type 'void'