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

为何TypeScript函数参数的联合类型会转为交叉类型?如何解决?

解决TypeScript中宠物类型与信息参数不匹配的问题

你的代码报错核心原因是:type和info的联合类型是独立定义的,TypeScript无法建立两者的关联关系——它会认为当你传入type: 'cat'时,info可能是DogInfo或CatInfo中的任意一种,因此会要求info同时满足两个接口的所有必填属性(即交叉类型DogInfo & CatInfo),这显然不符合你的实际调用逻辑。

下面是两种简单的解决方法:

方法一:使用函数重载

直接为每种宠物类型定义明确的函数签名,让TypeScript清晰对应参数关系:

interface DogInfo {
  canine: boolean
  name: string
}

interface CatInfo {
  feline: boolean
  name: string
}

const pets = new PetDb()

// 定义重载签名,明确每种type对应的info类型
function addPet(type: 'dog', info: DogInfo): void;
function addPet(type: 'cat', info: CatInfo): void;

// 实现签名,处理通用逻辑
function addPet(type: 'dog' | 'cat', info: DogInfo | CatInfo) {
  return pets[type].add(info as any);
}

方法二:使用泛型+类型映射

通过类型映射建立宠物类型与信息的绑定关系,扩展性更强:

interface DogInfo {
  canine: boolean
  name: string
}

interface CatInfo {
  feline: boolean
  name: string
}

// 建立宠物类型到信息类型的映射
type PetTypeMap = {
  dog: DogInfo
  cat: CatInfo
}

const pets = new PetDb()

// 泛型约束确保type和info严格对应
const addPet = <T extends keyof PetTypeMap>(type: T, info: PetTypeMap[T]) => {
  return pets[type].add(info);
}

两种方法都能解决报错问题:函数重载更直观,适合简单场景;泛型映射则更灵活,后续新增宠物类型时只需扩展PetTypeMap即可,无需修改函数逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 03:31:50