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

高效实现TypeScript泛型类型映射:替代嵌套条件类型

高效类型映射方案:用映射表+索引访问替代嵌套三元

当嵌套三元条件类型的映射对超过100个时,TypeScript会因递归检查的开销导致性能暴跌,纯类型系统下最高效的替代方案是基于映射表的索引访问类型——本质是把线性的条件判断改成O(1)的查表操作,完全规避递归性能问题。

具体实现步骤

  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;
      // ... 更多映射对
    };
    
  2. 实现转换类型
    利用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 00:26:16