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

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 = {}; // 报错

方案说明

  1. Pick<T, K>:仅保留当前遍历到的属性K,确保该属性为必填项
  2. Record<Exclude<keyof T, K>, never>:将T中除K外的所有属性映射为never类型,一旦传入这些属性就会触发类型报错
  3. [keyof T]:将遍历生成的多个单一属性类型转换为联合类型,编辑器会自动提示仅可选的单个属性,不会显示其他无关属性

这个实现完全满足你的需求:既严格禁止多属性共存,又能在编辑器中只显示合法的单一属性提示,没有冗余的可选属性干扰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 10:25:15