能否基于函数返回值实现TypeScript类型收窄?
基于函数返回值实现TypeScript类型收窄的解决方案
TypeScript默认不会通过函数返回值自动收窄联合类型,这是因为它无法确保函数每次调用的返回值稳定一致(比如函数可能依赖内部状态导致返回值变化),而属性的取值是确定的,所以能自动触发类型收窄。
针对你无法将getType()改为属性的场景,可以通过**自定义类型守卫(Type Guard)**来实现类型收窄,具体实现如下:
1. 定义类型守卫函数
创建一个返回类型谓词(foo is AFoo)的函数,明确判断对象类型:
interface AFoo { getType(): "A"; specificA(): void; } interface BFoo { getType(): "B"; } // 自定义类型守卫 function isAFoo(foo: AFoo | BFoo): foo is AFoo { return foo.getType() === "A"; }
2. 使用类型守卫收窄类型
在条件判断中调用这个守卫函数,TypeScript会自动将变量类型收窄为对应的接口:
var a: AFoo | BFoo = null as any; if (isAFoo(a)) { // 这里a的类型会被收窄为AFoo,可以安全调用specificA() a.specificA(); }
备选方案:手动类型断言(不推荐)
如果不想额外定义守卫函数,也可以在条件内手动添加类型断言,但这种方式需要重复写断言,不够优雅:
var a: AFoo | BFoo = null as any; if (a.getType() === 'A') { (a as AFoo).specificA(); }
内容的提问来源于stack exchange,提问作者Avi
相关产品推荐
相关产品推荐

