如何根据嵌套属性的值条件性确定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
相关产品推荐
相关产品推荐

