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

TypeScript中如何基于枚举实现类型收窄?

TypeScript 通过枚举实现类型自动推断与收窄

你当前的代码问题在于定义的NumberOrString类型没有建立dataType和data的关联,导致TypeScript无法通过dataType的判断自动收窄data的类型。不用类型断言也能解决,只需把类型改成判别式联合类型,让枚举值和对应的数据类型绑定:

修改后的类型定义

enum NumberOrStringType {
    NUMBER,
    STRING,
}

// 改成联合类型,每个成员明确对应枚举值和数据类型
type NumberOrString = 
    | { dataType: NumberOrStringType.NUMBER; data: number }
    | { dataType: NumberOrStringType.STRING; data: string };

使用时的代码(无需断言)

const numOrString: NumberOrString = { dataType: NumberOrStringType.NUMBER, data: 10 };

if (numOrString.dataType === NumberOrStringType.NUMBER) {
    // TypeScript自动推断numOrString.data为number类型
    const num: number = numOrString.data;
    // 后续逻辑
} else {
    // TypeScript自动推断numOrString.data为string类型
    const str: string = numOrString.data;
    // 后续逻辑
}

为什么原来的写法不行?

原来的NumberOrString类型里,dataType是整个NumberOrStringType枚举,data是string | number的联合类型,两者没有明确的绑定关系。TypeScript无法知道当dataType是NUMBER时,data一定是number类型。而修改后的联合类型把每个枚举值和对应的数据类型一一对应,TypeScript能识别这种关联,从而在判断dataType时自动完成类型收窄。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 00:42:07