如何在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
相关产品推荐
相关产品推荐

