2015-03-20 4 views
6

Возможно ли создать тип-защитник или что-то еще, что позволяет достичь той же цели, чтобы проверить, является ли переменная конкретным типом интерфейса в союзе типов?Проверьте, является ли переменная конкретным типом интерфейса в объединении типов.

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); 
})(); 

ответ

4

typeof не делает этого. Он всегда возвращает «string», «number», «boolean», «object», «function» или «undefined».

Вы можете проверить свойства объекта с помощью теста, такого как if(thing.a !== undefined) { или if(thing.hasOwnProperty('a')) {.

Обратите внимание, что вы могли бы сделать объект, который имел как строка a и строка b, так что надо знать о такой возможности.

+1

Таким образом, нет никакого способа, чтобы проверить, если переменная соответствует интерфейсу без проверки специфических свойств (например, «а» в нашем примере)? – myartsev

+0

Это правильно –

2

В машинопись 2 вы можете использовать Discriminated Unions так:

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

, а затем тест-объекта с помощью if (thing.kind === "foo").

Если у вас есть только 2 поля, как в примере, я бы, вероятно, пойти с комбинированным интерфейсом, @ryan-cavanaugh упомянутых и сделать оба свойства дополнительно:

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

Обратите внимание, что в оригинальной примере тестирования объекта с использованием if (thing.a !== undefined) производит ошибка Property 'a' does not exist on type 'Foo | Bar'.

И тестирование с использованием if (thing.hasOwnProperty('a')) не ограничивает тип до Foo внутри инструкции if.

@ryan-cavanaugh Есть ли лучший способ в TypeScript 2.0 или 2.1?

+0

Это самый безопасный способ получить проверки компилятора на объединениях, IMO и лучший способ справиться с проблемой OP. Я думаю, что это лучший ответ сейчас @myartsev – jocull

Смежные вопросы