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

TypeScript中如何约束对象:含key b则必须包含key c

解决TypeScript参数类型约束问题:存在b则必须存在c

直接使用{a: string} | {a: string, b: string, c: string}联合类型无法触发{a: 'abc', b: 'abc'}的报错,原因是TypeScript的结构类型系统会将该对象判定为符合{a: string}类型——多余的b属性不会被联合类型的第一个成员拒绝。

解决方案:交叉类型+分支约束

通过交叉类型结合分支约束,强制实现「要么没有b,要么同时有b和c」的规则:

type ValidParams = { a: string } & (
  // 分支1:不存在b(或b为never类型,无法赋值)
  { b?: never } 
  // 分支2:同时存在b和c,且均为string类型
  | { b: string; c: string }
);

测试验证

// 合法:仅包含a
const case1: ValidParams = { a: 'abc' };

// 合法:包含a、b、c
const case2: ValidParams = { a: 'abc', b: 'def', c: 'ghi' };

// 报错:存在b但缺少c,不符合任何分支约束
const case3: ValidParams = { a: 'abc', b: 'def' };

原理说明

  • 当对象包含b: string时,无法匹配{b?: never}分支(never类型不能赋值为string),只能匹配{b: string; c: string}分支,因此必须同时存在c属性。
  • 当对象不包含b时,自动匹配{b?: never}分支,仅需满足{a: string}即可。

内容的提问来源于stack exchange,提问作者Max Lascombe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 09:25:04