如何指定函数类型,使其仅接受严格的A类型或B类型参数
实现严格的联合类型参数校验
要让函数仅接受严格符合A或B类型的参数(禁止混合属性),可以通过禁止额外属性的TypeScript类型技巧实现,核心思路是让联合类型的每个成员都排除其他成员的属性。
步骤1:定义基础类型
type A = { propA1: string propA2: string } type B = { propB1: string propB2: string }
步骤2:构造严格的联合类型
方案一:针对具体类型定制
直接为A和B分别添加额外属性的禁止约束:
// 禁止A类型包含B的属性 type StrictA = A & Record<Exclude<keyof B, keyof A>, never>; // 禁止B类型包含A的属性 type StrictB = B & Record<Exclude<keyof A, keyof B>, never>; // 严格的联合类型 type StrictAB = StrictA | StrictB;
方案二:通用工具类型(复用性更高)
如果需要频繁处理这类场景,可以定义通用的StrictUnion工具类型:
// 将联合类型转换为交叉类型,用于获取所有可能的属性键 type UnionToIntersection<U> = (U extends unknown ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never; // 生成严格的联合类型,禁止成员包含其他类型的属性 type StrictUnion<T> = T extends unknown ? T & Record<Exclude<keyof UnionToIntersection<T>, keyof T>, never> : never;
步骤3:应用到函数参数
// 使用方案一的StrictAB const f = (arg: StrictAB) => { }; // 或使用方案二的通用工具类型 // const f = (arg: StrictUnion<A | B>) => { };
效果验证
- 合法调用(无错误):
f({ propA1: 'val', propA2: 'val' }); // 符合StrictA f({ propB1: 'val', propB2: 'val' }); // 符合StrictB - 非法调用(触发TypeScript错误):
f({ propA1: 'val', propA2: 'val', propB1: 'val' }); // 包含B的属性,违反约束
内容的提问来源于stack exchange,提问作者Uzakov Nikita
相关产品推荐
相关产品推荐

