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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 22:13:15