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

如何指定函数类型,使其仅接受严格的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 06:42:36