我有下面的代码,即使使用
is
运算符,我也无法缩小类型范围。我尝试使用 isPerson
fn 来声明它是 Person type
,但在函数内,如何访问特定属性以了解它是否是这种类型?
interface Person {
age: number;
}
interface Animal {
color: string
}
const test = (arg: Person | Animal): Person | Animal => {
return arg;
}
const isPerson = (num: Person | Animal): num is Person => {
return !!num.age;
}
var person = test({ age: 12 });
if(isPerson(person)){
person.age;
}
我在 isPerson 中遇到的错误是
Property 'age' does not exist on type 'Person | Animal'.
Property 'age' does not exist on type 'Animal'.(2339)
编译器不喜欢您的
num
参数可能是 Animal
,因此没有 age
属性。
一种方法是使用
in
运算符:
const isPerson = (num: Person | Animal): num is Person => {
return 'age' in num;
}
与您的代码的区别在于,它评估存在
age
属性但具有不同的 0
值的边缘情况。