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
相关产品推荐
相关产品推荐

