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

如何根据嵌套属性的值条件性确定TypeScript类型?

解决嵌套Condition对象的TypeScript类型约束问题

问题出在TypeScript对联合类型的额外属性检查规则上:当联合类型的分支是字符串字面量时,对象字面量赋值会触发严格的额外属性检查;但分支是对象类型时,默认不会严格检查多余属性,导致key1和key2可以同时存在。

要实现和第一个示例完全一致的约束,需要在每个联合分支中明确禁止不需要的属性,通过将多余属性的类型设为never来实现:

type MyConditionType2 = {
  id: number;
} & (
  | {
      condition: { name: 'BUY' };
      key1: string;
      key2?: never; // 明确禁止key2存在
    }
  | {
      condition: { name: 'SELL' };
      key2: string;
      key1?: never; // 明确禁止key1存在
    }
);

// 合法对象
const obj2Valid: MyConditionType2 = {
  id: 1,
  condition: { name: 'BUY' },
  key1: 'sda',
};

// 非法对象(同时包含key1和key2)
const obj2Invalid: MyConditionType2 = {
  id: 1,
  condition: { name: 'BUY' },
  key1: 'sda',
  key2: 'sde', // 此处会报错:类型“string”不能赋值给类型“undefined”
};

// 非法对象(condition为SELL却带key1)
const obj3Invalid: MyConditionType2 = {
  id: 1,
  condition: { name: 'SELL' },
  key1: 'sda', // 此处会报错:类型“string”不能赋值给类型“undefined”
};

原理说明

  • 使用key?: never表示该属性既不能被定义,也不能赋值(即使赋值undefined也不行)
  • 这种方式强制TypeScript在类型检查时,严格匹配当前分支允许的属性,完全复刻字符串字面量condition的约束行为

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 10:18:19