You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在TypeScript中收窄函数返回的联合类型?

TypeScript类型收窄:解决类型守卫中属性访问报错问题

我写了下面的代码,想用is操作符收窄类型,尝试用isPerson函数判断是否为Person类型,但函数内部访问特定属性时出现错误,该怎么处理?

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函数中出现如下错误:

类型“Person | Animal”上不存在属性“age”。
  类型“Animal”上不存在属性“age”。(2339)

解决方法

要在类型守卫函数中安全访问属性并完成类型判断,有几种可行方案:

1. 使用in操作符检查属性存在性

in操作符是TypeScript认可的类型收窄方式,它会告诉编译器:如果对象包含指定属性,则属于对应类型。修改后的isPerson函数如下:

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

2. 结合类型断言与属性类型检查

如果需要更严格的类型验证(比如确认属性是指定类型),可以先通过类型断言访问属性,再检查其类型:

const isPerson = (obj: Person | Animal): obj is Person => {
  return typeof (obj as Person).age === 'number';
}

3. 双重验证(属性存在+类型匹配)

为了兼顾准确性和安全性,可以同时检查属性存在性和属性类型:

const isPerson = (obj: Person | Animal): obj is Person => {
  return 'age' in obj && typeof obj.age === 'number';
}

内容的提问来源于stack exchange,提问作者Nidhin Joseph

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 19:13:14