Tôi đang sử dụng trình bảo vệ loại TypeScript trong toán tử bậc ba trong vòng lặp và thấy hành vi mà tôi không hiểu.Loại bảo vệ kiểu chữ Oddity
giao diện My
interface INamed {
name: string;
}
interface IOtherNamed extends INamed {
otherName: string;
}
loại bảo vệ My
function isOther(obj: any): obj is IOtherNamed {
... // some check that returns boolean
}
Cách sử dụng chung mẫu
var list: Array<{named: INamed}> = [];
for(let item of list) {
var other: IOtherNamed = ...
}
Bên trong của tôi cho .. của vòng lặp Tôi đang sử dụng bảo vệ kiểu của tôi để gán một trong hai mục hiện tại của tôi hoặc null cho một biến của IOtherNamed.
này không hoạt động
// Compiler Error: INamed is not assignable to IOtherNamed
for(let item of list) {
var other: IOtherNamed = isOther(item.named) ? item.named : null;
}
này không
for(let item of list) {
var named: INamed = item.named;
var other2: IOtherNamed = isOther(named) ? named : null;
}
Câu hỏi của tôi
- Đây có phải là do thiết kế mà một trong những tác phẩm wh ile khác không?
- Nếu theo thiết kế, sắc thái ở đây xác định khi nào nó hoạt động hay không? Đặc biệt tại sao việc gán đối tượng của tôi cho một biến mới (không có bất kỳ thay đổi kiểu nào) loại bỏ lỗi trình biên dịch?
Cảm ơn, chính xác thông tin tôi cần. – bingles
Và sẽ được sửa trong TS 2.0: https://github.com/Microsoft/TypeScript/issues/3812 – Alex