TypeScript中条件分支未写return为何未触发类型校验错误?
TypeScript 未抛出编译错误的核心原因
这段代码没有触发编译报错,本质是TypeScript默认的类型检查规则不会覆盖「函数存在隐式返回undefined的分支」这类场景,具体拆解如下:
- 首先梳理函数的实际执行路径:
- 当
score >= 2.2时,分支内仅实例化ReportStatus对象,没有编写return语句,该分支执行完成后实际返回值为undefined - 当
0 < score < 2.2时,分支正常返回ReportStatus类型实例 - 当
score <= 0时,进入else分支正常返回ReportStatus类型实例
- 当
- 默认配置下,TypeScript不会对函数的所有代码路径做返回值一致性校验:即使你显式标注了函数返回值类型为
ReportStatus,隐式返回undefined的路径也不会被默认检测为类型错误。 - 想要让TS对这类场景抛出错误,需要手动在
tsconfig.json中开启两个配置:- 开启
strictNullChecks: true,让TS识别undefined是和ReportStatus不兼容的类型 - 开启
noImplicitReturns: true,强制TS扫描函数内所有执行分支,校验是否每个路径都存在显式return语句、返回值匹配声明类型
- 开启
注意:很多开发者误以为开启
strict: true全严格模式会自动覆盖这个校验,实际上noImplicitReturns不属于strict模式默认开启的规则集合,必须单独配置才会生效。
修正后的代码参考
补上第一个分支缺失的return语句即可让所有分支返回值匹配声明类型,另外中间分支的score < 2.2判断属于冗余逻辑——进入该else if分支时,已经天然不满足上一个if的score >=2.2条件,可以直接省略:
const getStatus = (score: number): ReportStatus => { if (score >= 2.2) { return new ReportStatus(ReportStatusEnum.Excellent); } else if (score > 0) { return new ReportStatus(ReportStatusEnum.NeedsAdjustment); } else { return new ReportStatus(ReportStatusEnum.NeedsImmediateAttention); } };
内容的提问来源于stack exchange,提问作者Mehdi Parhizi
相关产品推荐
相关产品推荐

