我有一个函数,它使用两个接口之一返回值,如下所示:
interface K {
A:number;
NUM:number;
}
interface L {
A:string;
STR:string;
}
function FUN():K|L { }
var x:K|L = FUN();
但我无法使用像这样的类型保护来访问非共享属性:
if(typeof x.A === 'string'){
console.log(x.STR) // Property 'STR' does not exist on type 'K | L'
}
即使if子句确实区分了这两种类型。我知道我可以使用带有变量赋值的as
运算符来向编译器指示类型,如下所示:
if(typeof x.A === 'string'){
var y = x as L;
console.log(y.STR) // OK
}
但是这似乎有些麻烦,因为这会在生成的js代码中添加不必要的var
语句和赋值:
function FUN() { }
var x = FUN();
if (typeof x.A === 'string') {
var y = x; // unnecessary...
console.log(y.STR);
}
如果没有JS代码中的额外var y=x;
,有没有办法在这种情况下指明类型?
答案 0 :(得分:3)
是的,TypeScript支持类型转换。你应该能够做到:
if(typeof x.A === 'string'){
console.log((<L>x).STR);
}