如何在TypeScript中根据operation类型条件约束对象的id字段类型?
根据operation动态约束id字段类型
你要的这种根据operation取值来条件式定义id类型的需求完全可以实现,下面是两种常用的解决方案:
方案一:联合类型枚举(直观易懂)
直接把每种operation对应的对象类型枚举出来,TypeScript会自动关联operation和id的约束关系:
type Operation = 'create' | 'update' | 'delete'; type MutationKey = | { operation: 'create'; id?: undefined } // create时id可选且只能是undefined | { operation: 'update' | 'delete'; id: string }; // update/delete时id必须是string // 验证示例 const ex1: MutationKey = { operation: "create" }; // ✅ 正确 const ex2: MutationKey = { operation: "update", id: "1" }; // ✅ 正确 const ex3: MutationKey = { operation: "create", id: "2" }; // ❌ 报错(create不允许传string类型的id) const ex4: MutationKey = { operation: "delete" }; // ❌ 报错(delete必须传id)
方案二:泛型+条件类型(灵活可扩展)
如果后续需要扩展Operation的取值,用泛型结合条件类型的方式更便于维护:
type Operation = 'create' | 'update' | 'delete'; // 泛型T约束为Operation类型,根据T的取值动态决定id类型 type MutationKey<T extends Operation> = { operation: T; id: T extends 'create' ? undefined : string; }; // 验证示例 const ex1: MutationKey<'create'> = { operation: "create" }; // ✅ 正确 const ex2: MutationKey<'update'> = { operation: "update", id: "1" }; // ✅ 正确 const ex3: MutationKey<'create'> = { operation: "create", id: "2" }; // ❌ 报错 const ex4: MutationKey<'delete'> = { operation: "delete" }; // ❌ 报错
两种方案都能实现你的需求:当operation为create时id必须是undefined(甚至可以完全不写),当operation为update或delete时id必须是string类型。
内容的提问来源于stack exchange,提问作者Jesse
相关产品推荐
相关产品推荐

