Đây là theo thiết kế (Tôi sẽ giải thích lý do tại sao thiết kế này nhanh chóng). Spec nói (trong phần 3.6.3, tóm tắt cho rõ ràng):
A type S is assignable to a type T, and T is assignable from S, if one of the following is true...
Trong trường hợp này, chúng tôi đang thử nghiệm nếu () => string
là chuyển nhượng để () => void
. Vì vậy, string
phải được gán cho void
(không phải là) hoặc void
phải là void
(đúng).
Trong thực tế, các quy tắc ở đây là bạn được phép vứt bỏ giá trị trả về, đó là phù hợp với cách ví dụ C++ xử lý void
ở độ phân giải mẫu.
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?
Khi chúng tôi hạn chế các loại change
là (widget) => void
, chúng tôi đang làm cho nó để bạn có thể vượt qua decrementWidgetHeight
như là đối số thứ hai mặc dù nó có một giá trị trả về, nhưng vẫn đảm bảo rằng khi chúng ta viết nội dung của applyToManyWidgets
, chúng tôi không vô tình sử dụng giá trị trả lại là change
ở bất kỳ đâu.
Lưu ý rằng void
vẫn khác với any
vì đây là thừa nhận:
function f() { }
var x = f(); // Disallowed, f() is of type 'void'
Nguồn
2012-10-06 21:06:26
Tôi đã [nộp một vấn đề] (http://typescript.codeplex.com/workitem/139). –