请考虑使用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
类型,并且无需抱怨。
答案 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');
}..