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
相关产品推荐
相关产品推荐

