2015-03-20 14 views
6

Có thể tạo một kiểu gõ hay một thứ khác hoàn thành cùng một mục đích không, để kiểm tra xem biến có phải là loại giao diện cụ thể trong liên minh dạng chữ không?Kiểm tra xem biến có phải là loại giao diện cụ thể trong một liên minh dạng số

interface Foo { a:string } 
interface Bar { b:string } 

(function() { 
    function doStuff(thing: Foo | Bar) { 
     if(typeof thing === 'Foo') { 
      console.log('Foo'); 
     } 
     else if (typeof thing === 'Bar') { 
      console.log('Bar'); 
     } 
     else { 
      console.log('unknown'); 
     } 
    } 

    var thing: Foo = {a:'a'}; 
    doStuff(thing); 
})(); 

Trả lời

4

typeof không thực hiện việc này. Nó luôn trả về "chuỗi", "số", "boolean", "đối tượng", "hàm" hoặc "không xác định".

Bạn có thể kiểm tra các thuộc tính đối tượng bằng thử nghiệm như if(thing.a !== undefined) { hoặc if(thing.hasOwnProperty('a')) {.

Lưu ý rằng bạn có thể tạo đối tượng có cả hai một chuỗi a và một chuỗi b, vì vậy hãy lưu ý về khả năng đó.

+1

Vì vậy, không có cách nào để kiểm tra xem một biến phù hợp với một giao diện mà không kiểm tra tính chất cụ thể (như 'a' trong ví dụ của chúng tôi)? – myartsev

+0

Đó là chính xác –

2

Trong nguyên cảo 2 bạn có thể sử dụng Discriminated Unions như thế này:

interface Foo { 
    kind: "foo"; 
    a:string; 
} 
interface Bar { 
    kind: "bar"; 
    b:string; 
} 
type FooBar = Foo | Bar; 
let thing: FooBar; 

và sau đó đối tượng kiểm tra sử dụng if (thing.kind === "foo").

Nếu bạn chỉ có 2 lĩnh vực như trong ví dụ tôi có lẽ sẽ đi với giao diện kết hợp như @ryan-cavanaugh đề cập và làm cho cả hai thuộc tính tùy chọn:

interface FooBar { 
    a?: string; 
    b?: string 
} 

Lưu ý rằng trong gốc dụ kiểm tra các đối tượng sử dụng if (thing.a !== undefined) sản xuất lỗi Property 'a' does not exist on type 'Foo | Bar'.

Và thử nghiệm nó bằng cách sử dụng if (thing.hasOwnProperty('a')) không thu hẹp loại thành Foo trong câu hỏi if.

@ryan-cavanaugh có cách nào tốt hơn trong TypesScript 2.0 hoặc 2.1 không?

+0

Đây là cách an toàn nhất để có được kiểm tra trình biên dịch về công đoàn, IMO, và cách tốt nhất để xử lý vấn đề của OP. Tôi nghĩ đây là câu trả lời hay nhất hiện nay @myartsev – jocull

Các vấn đề liên quan