高效实现TypeScript泛型类型映射:替代嵌套条件类型
高效类型映射方案:用映射表+索引访问替代嵌套三元
当嵌套三元条件类型的映射对超过100个时,TypeScript会因递归检查的开销导致性能暴跌,纯类型系统下最高效的替代方案是基于映射表的索引访问类型——本质是把线性的条件判断改成O(1)的查表操作,完全规避递归性能问题。
具体实现步骤
定义映射表类型
把所有需要映射的类型对整理成键值对形式的类型别名或接口,键是源类型,值是目标类型:// 示例基础类型 type Kitten = { kind: 'kitten'; meow: () => void }; type Cat = { kind: 'cat'; purr: () => void }; type Puppy = { kind: 'puppy'; woof: () => void }; type Dog = { kind: 'dog'; bark: () => void }; // 可扩展任意数量的映射对,哪怕几百个都不会影响性能 type AnimalTypeMap = { Kitten: Cat; Puppy: Dog; // ... 更多映射对 };实现转换类型
利用TypeScript的索引访问特性,结合条件类型判断源类型是否在映射表的键集中,匹配则返回对应目标类型,否则返回原类型:type ConvertType<T> = T extends keyof AnimalTypeMap ? AnimalTypeMap[T] : T;
方案优势
- 性能不受映射数量影响:索引访问是TypeScript类型系统优化过的操作,无论映射表有多少键值对,查找都是直接定位,不会像嵌套三元那样产生深度递归的类型检查。
- 天然支持联合类型:如果输入是联合类型,会自动分发到每个成员进行映射,比如
ConvertType<Kitten | Puppy>会直接得到Cat | Dog。 - 维护成本低:映射表是扁平的键值对结构,比嵌套三元更易读、易修改,新增/删除映射对只需在映射表里操作,无需调整条件链。
扩展场景
如果需要支持反向映射(比如把Cat转回Kitten),只需再定义一个反向映射表:
type ReverseAnimalTypeMap = { Cat: Kitten; Dog: Puppy; // ... 反向映射对 }; type ReverseConvertType<T> = T extends keyof ReverseAnimalTypeMap ? ReverseAnimalTypeMap[T] : T;
内容的提问来源于stack exchange,提问作者LaVache
相关产品推荐
相关产品推荐

