Typescript类型保护:使用in运算符

时间:2019-08-21 15:12:28

标签: typescript

我正在学习TypeScript,并从Official DOCS

开始有关Type Guard的练习。

我正在使用TypeScript 3.5.3测试所提供的示例(或多或少):

function exec(strOrNum: string | number) {
    if ("substring" in strOrNum) {
        return strOrNum.substring(1);
    }
    return strOrNum.toExponential(2);
}

但是VSCode引发了以下错误:

  

“ in”表达式的右侧必须为“ any”类型,对象类型或类型参数。ts(2361)

我不明白,知道吗?

1 个答案:

答案 0 :(得分:5)

  

如果指定的属性在指定的对象或其原​​型链中,则in operator返回true

这意味着它对对象(或数组)而不是字符串进行操作。

如果要添加类型保护以区分stringnumber,则必须使用typeof

function exec(strOrNum: string | number) {
    if (typeof strOrNum === "string") {
        return strOrNum.substring(1);
    }
    return strOrNum.toExponential(2);
}

如果您有两个接口的并集,则可以使用in运算符:

interface A {
    a: string;
}

interface B {
    b: number;
}


function test(arg: A | B): string {
    if ('a' in arg) {
        return arg.a;
    }
    return arg.b.toFixed(2);
}