Bu tasarım gereğidir (bu iyi tasarım kısa bir süre olduğunu açıkladığım gerekir). Spec (netlik için kısaltılmış, bölüm 3.6.3 olarak) diyor ki:
A tipi S T türü için atanabilir ve aşağıdakilerden biri doğruysa, T, S atanabilir olduğunu ...
S, T, T, her üyesi M, aşağıdakilerden biri geçerlidir, nesne türleri ve:
Bu durumda, biz test ediyoruz () => stringatanabilir olduğunu () => void. Yani ya stringatanabilir olmak zorundadır void(değil), ya da voidolmak zorunda void(öyle).
Gerçekte, burada kural olduğunu size dönüş değeri atmak için izin verilir nasıl mesela C ++ davranır ile tutarlıdır, voidşablon çözünürlükte.
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?
Biz türünü sınırlamak zaman changeolduğu (widget) => void, sizi geçirebilmesi için bunu yapıyoruz decrementWidgetHeightbir dönüş değeri vardır rağmen ikinci argüman olarak, ama yine de biz gövdesini yazarken emin applyToManyWidgets, biz yanlışlıkla kullanmayın değerini döndürür changeher yerde.
Not voidhala farklıdır anybu unallowed çünkü:
function f() { }
var x = f(); // Disallowed, f() is of type 'void'