TypeScript组合属性共存约束时推断为never的解决方案
解决TypeScript联合类型推断为never的问题
问题原因
你定义的EitherOrBoth类型导致AnyConfig被推断为never,核心原因是ConfigA和ConfigB的fooB属性是互斥的字面量类型:
ConfigA的fooB固定为false,ConfigB的fooB固定为true,两者无法同时满足;- 你的
None<T>类型会把T的所有键(包括fooB)定义为?: never,当和另一个子类型交叉时,false & never或true & never都会得到never; - 三个分支
T1 & None<T2>、T2 & None<T1>、T1 & T2最终都变成never,联合后自然还是never。
正确解决方案
因为你已经通过fooB这个辨别属性区分了两个子类型,直接使用基础联合类型就能完全满足需求,不需要复杂的交叉逻辑:
// 基类型与子类型定义 interface BaseConfig { fooB: boolean; optbar?: number; } interface ConfigA extends BaseConfig { fooB: false; first: number; } interface ConfigB extends BaseConfig { fooB: true; second: number; third: number; } // 直接定义为联合类型 type AnyConfig = ConfigA | ConfigB;
验证效果
这样定义后,既能正常赋值,也能通过条件判断自动推断子类型:
// 正常赋值,无类型错误 const configA: AnyConfig = { fooB: false, first: 100 }; const configB: AnyConfig = { fooB: true, second: 200, third: 300 }; // 条件判断自动推断子类型 function processConfig(config: AnyConfig) { if (config.fooB) { // 此处config被推断为ConfigB,可直接访问second、third console.log(config.second, config.third); } else { // 此处config被推断为ConfigA,可直接访问first console.log(config.first); } }
内容的提问来源于stack exchange,提问作者rodriguezrrp
相关产品推荐
相关产品推荐

