我正在学习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)
我不明白,知道吗?
答案 0 :(得分:5)
如果指定的属性在指定的对象或其原型链中,则
in
operator返回true
。
这意味着它对对象(或数组)而不是字符串进行操作。
如果要添加类型保护以区分string
和number
,则必须使用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);
}