考虑以下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类型,没有必要抱怨。
发布于 2016-02-16 06:46:40
您可以使用
return (<B>item).num;向TypeScript编译器提供提示。
发布于 2016-02-16 09:01:49
另外,另一种方法是使用用户定义类型保护函数
所以,你可以有这样的
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');
}..https://stackoverflow.com/questions/35422600
复制相似问题