在TypeScript中键入Assertion而不指定新变量

时间:2016-03-12 06:51:30

标签: typescript

我有一个函数,它使用两个接口之一返回值,如下所示:

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;,有没有办法在这种情况下指明类型?

1 个答案:

答案 0 :(得分:3)

是的,TypeScript支持类型转换。你应该能够做到:

if(typeof x.A === 'string'){
    console.log((<L>x).STR);
}