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

TypeScript条件类型右侧为何不能使用never?

TypeScript条件类型右侧为何不能使用never?

嘿,这个问题其实戳中了TypeScript映射类型和条件类型交互的一个关键细节,咱们一步步给你掰扯清楚:

首先得回到你的场景:你想让CheckConf这个映射类型,把每个属性校验成[Key, [Key, Key]]的格式,一开始觉得不匹配的分支返回never很合理——毕竟不符合要求的类型本来就不该存在,但结果却出现了假阳性,这到底是为啥?

核心原因:never属性会被TypeScript自动从对象类型中移除

当你在映射类型里给某个属性赋值为never时,TypeScript会默认把这个属性从最终生成的类型里删掉。举个例子:

type Test = { a: never; b: string };
// 实际等价于 type Test = { b: string }

放到你的代码里来看:
如果用never作为不匹配分支,比如对于错误的{ a: ["a", ["a", "b"]] },CheckConf<TConf>会生成{ a: never },然后TypeScript直接把a属性删掉,最终得到的类型是{}。这时候你把函数参数类型设为CheckConf<TConf>,TypeScript会认为{ a: ["a", ["a", "b"]] }可以赋值给{}(因为对象允许有额外属性),自然就不会报错——这就是你遇到的假阳性问题!

为什么返回TConf[Key]就管用?

当你把不匹配分支换成TConf[Key]时,映射类型会保留原属性的错误类型。比如刚才的错误例子,CheckConf<TConf>里的a属性还是["a", ["a", "b"]],而我们期望的正确类型是["a", ["a", "a"]]。这两个类型一对比,TypeScript就能精准发现第二个元组的第二个元素类型不匹配,直接在错误的位置抛出提示,完全符合你想要的“定位到元组索引级别的错误”的需求。

再补个小总结

  • 用never的问题:不符合要求的属性会被从映射结果中移除,错误对象能通过类型检查(因为空对象允许额外属性)
  • 用TConf[Key]的优势:保留错误属性的原始类型,让TypeScript对比期望类型和实际类型,给出精准的位置错误

这种细节其实是TypeScript为了处理高级类型场景(比如Exclude、Omit这类工具类型)设计的规则,但在咱们的参数校验场景里,反而需要反其道而行之,用保留原类型的方式来触发正确的报错。

备注:内容来源于stack exchange,提问作者Jonathan Raoult

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 07:45:33