TypeScript实现React组件Props互斥:仅传Identifiers单个属性
实现仅允许传入单个属性的TypeScript类型
针对你的需求,可以通过分布式条件类型结合工具类型实现严格的单一属性约束,确保只能传入Identifiers中的某一个属性,其余属性完全无法传入(而非设为可选或never的松散约束)。
核心实现代码
type Identifiers = { alias: string; personalId: number; customerId: number; }; // 生成仅包含单个属性的类型联合 type SingleProperty<T> = { [K in keyof T]: Pick<T, K> & Record<Exclude<keyof T, K>, never>; }[keyof T]; // 应用到Identifiers类型 type SingleIdentifier = SingleProperty<Identifiers>;
效果验证
// 合法示例:仅传入单个属性 const validAlias: SingleIdentifier = { alias: "john_doe" }; const validPersonalId: SingleIdentifier = { personalId: 12345 }; const validCustomerId: SingleIdentifier = { customerId: 67890 }; // 非法示例:传入多个属性会直接报错 const invalid1: SingleIdentifier = { alias: "jane", personalId: 123 }; // 报错 const invalid2: SingleIdentifier = { personalId: 789, customerId: 012 }; // 报错 // 非法示例:空对象也会报错(必须传入一个属性) const invalid3: SingleIdentifier = {}; // 报错
方案说明
Pick<T, K>:仅保留当前遍历到的属性K,确保该属性为必填项Record<Exclude<keyof T, K>, never>:将T中除K外的所有属性映射为never类型,一旦传入这些属性就会触发类型报错[keyof T]:将遍历生成的多个单一属性类型转换为联合类型,编辑器会自动提示仅可选的单个属性,不会显示其他无关属性
这个实现完全满足你的需求:既严格禁止多属性共存,又能在编辑器中只显示合法的单一属性提示,没有冗余的可选属性干扰。
内容的提问来源于stack exchange,提问作者Andyally
相关产品推荐
相关产品推荐

