2015-11-02 16 views
6

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

  1. Đâ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?
  2. 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?

Trả lời

4

Vâng, đây là do thiết kế cho nguyên cảo < 2.0:

Lưu ý rằng bảo vệ loại ảnh hưởng đến loại biến và các thông số chỉ và không có ảnh hưởng đến các thành viên của các đối tượng như tài sản.

-4,20 từ đặc tả ngôn ngữ (PDF, trang 83)

Vì vậy, lý do nó hoạt động trong kịch bản thứ hai là vì bạn đã gán tài sản cho một biến và sau đó đánh tiếp bảo vệ rằng biến.

Cập nhật: Như Alex đã chỉ ra, TypeScript 2.0 sẽ hỗ trợ loại bảo vệ trên thuộc tính.

+0

Cảm ơn, chính xác thông tin tôi cần. – bingles

+0

Và sẽ được sửa trong TS 2.0: https://github.com/Microsoft/TypeScript/issues/3812 – Alex