如何缩小函数的联合返回类型范围

问题描述 投票:0回答:1

我有下面的代码,即使使用

is
运算符,我也无法缩小类型范围。我尝试使用
isPerson
fn 来声明它是
Person type
,但在函数内,如何访问特定属性以了解它是否是这种类型?

游乐场代码:https://www.typescriptlang.org/play?ssl=13&ssc=7&pln=13&pc=15#code/JYOwLgpgTgZghgYwgAgArQM4HsTIN4BQyycA5hAFzIgCuAtgEbQDcBAvgQaJLIigIIhgdOABt8RZAiyisUKhjBRQpdp2 khFySFoC8yABRwopKuijZcAH2SDhYgJRnMOZDbsjxugHwTiUCDAaKFxjUlYOAg0tYAxzS2R9A1o6ZwtXdyFPJ2p6ZFi0F1wfP2QAoJDkAEIqlIA6MggIzgA3Y2QAByLE7QhFAzwScioARgamZDYHVi4YA1j4n AMu9JAHB0JiFcsG8magA

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)
javascript typescript
1个回答
0
投票

编译器不喜欢您的

num
参数可能是
Animal
,因此没有
age
属性。

一种方法是使用

in
运算符:

const isPerson = (num: Person | Animal): num is Person => {
  return 'age' in num;
}

与您的代码的区别在于,它评估存在

age
属性但具有不同的
0
值的边缘情况。

© www.soinside.com 2019 - 2024. All rights reserved.