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

TypeScript中如何自动维护动物类型到对应处理函数的映射类型

解决方案

可以通过映射类型+条件类型实现自动维护且类型安全的映射定义,具体实现如下:

首先保留你的联合类型定义:

type Cat = { type: 'Cat', likesMilk: boolean }
type Dog = { type: 'Dog', barksLoudly: boolean }
// 新增子类型直接加在这里即可
type Animal = Cat | Dog;

然后定义自动推导的映射类型:

type AnimalHandlerMap = {
  [K in Animal['type']]: (animal: Extract<Animal, { type: K }>) => void
};

核心逻辑说明:

  • [K in Animal['type']]:遍历Animal联合类型中所有type字段的取值,自动生成映射的键。新增Animal子类型时,这里会自动新增对应的键,未实现对应处理函数的话TypeScript会直接抛出编译错误,和Record类型的提示效果一致。
  • Extract<Animal, { type: K }>:从Animal联合类型中精准提取出type等于K的子类型,确保每个键对应的函数参数是严格匹配的子类型,彻底避免错误赋值(比如无法给map['Cat']分配接收Dog的函数)。

使用示例:

const animalMap: AnimalHandlerMap = {
  Cat: (cat) => console.log(cat.likesMilk),
  Dog: (dog) => console.log(dog.barksLoudly)
};

// 如果新增一个Bird类型:
type Bird = { type: 'Bird', canFly: boolean };
type Animal = Cat | Dog | Bird;

// 此时animalMap会触发编译错误,提示缺少Bird对应的处理函数,同时Bird对应的函数参数会自动推导为Bird类型

这种方式既保留了Record类型自动提示未实现项的优势,又保证了每个处理函数的参数类型精确,新增动物子类型时无需手动修改映射类型,完全自动维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 08:25:16