我有以下代码,即使使用is操作符,我也无法缩小类型范围.我try 使用isPerson fn来声明它是Person type,但是在函数中,我如何访问特定的属性以知道它是否是这种类型?

playground 编码:https://www.typescriptlang.org/play?ssl=13&ssc=7&pln=13&pc=15#code/JYOwLgpgTgZghgYwgAgArQM4HsTIN4BQyycA5hAFzIgCuAtgEbQDcBAvgQaJLIigIIhgdOABt8RZAiyisUKhjBRQpdp2khFySFoC8yABRwopKuijZcAH2SDhYgJRnMOZDbsjxugHwTiUCDAaKFxjUlYOAg0tYAxzS2R9A1o6ZwtXdyFPJ2p6ZFi0F1wfP2QAoJDkAEIqlIA6MggIzgA3Y2QAByLE7QhFAzwScioARgAmZDYHVi4YA1j4nAMu9JAHB0JiFcsG8magA

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 operator:

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

您的代码的不同之处在于,它计算存在age属性但值为0的边缘情况的方式不同.

Javascript相关问答推荐

vscode扩展-webView Panel按钮不起任何作用

判断表格单元格中是否存在文本框

无法检测卡片重叠状态的问题

我的角模板订阅后不刷新'

使用原型判断对象是否为类的实例

IF语句的计算结果与实际情况相反

在我的index.html页面上找不到我的Java脚本条形图

使用getBorbingClientRect()更改绝对元素位置

使用类型:assets资源 /资源&时,webpack的配置对象&无效

如何为仅有数据可用的点显示X轴标签?

JavaScript:如果字符串不是A或B,则

将Auth0用户对象存储在nextjs类型脚本的Reaction上下文中

使用Reaction窗体挂钩注册日历组件

Socket.IO在刷新页面时执行函数两次

无法使用npm install安装react-dom、react和next

使用可配置项目创建网格

在点击链接后重定向至url之前暂停

由于http.get,*ngIf的延迟很大

react :图表负片区域不同 colored颜色

如何格式化API的响应