如何在TypeScript中使用具有接口联合类型的实例?

时间:2016-02-16 02:26:42

标签: typescript

请考虑使用TypeScript代码:

class A {public name: string = 'A';}
interface B {num: number;}

class Foo {
    get mixed(): Array<A | B> {
        const result = [];
        for (var i = 0; i < 100; i ++) {
            result.push(Math.random() > 0.5 ? new A() : {num: 42});
        }
        return result;
    }

    print(): string {
        return this.mixed.map(item => {
            if (item instanceof A) {
                return item.name;
            }

            return item.num;    
        }).join('\n');
    }
}

print函数中,我需要根据item的类型返回不同的值。对于A类型,它易于使用instanceof,但对于B,我无法使用instanceof,因为B是一个界面

TypeScript无法理解,在item.num行中,item确实是B类型,并且无需抱怨。

2 个答案:

答案 0 :(得分:1)

您可以使用

return (<B>item).num;

给出TypeScript编译器的提示。

答案 1 :(得分:1)

此外,另一种方法是使用user defined type guard functions

所以,你可以拥有像

这样的东西
  class A ...
  interface B ...
  function isB(item: any): item is B {
      return item && 'num' in item;
  }

  class Foo {...
     print(): string {
         return this.mixed.map(item => {
            if (item instanceof A) {
              return item.name;
            } else if(isB(item)){
              return item.num;
            }  
    }).join('\n');
  }..