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

能否基于函数返回值实现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 00:57:37