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

TypeScript通用泛型解析:适配任意Map结构的可复用工具类型

实现适配任意字符串键映射类型的通用Resolve工具类型

需要创建一个可复用的TypeScript工具类型Resolve,使其能适配任何键为string、值为统一类型的映射结构(比如示例中的SomeMap<T>),而无需硬编码依赖某个具体的映射类型定义。

原尝试的错误代码:

type SomeMap<T> = {
  [key: string]: T;
};

// 报错代码:语法错误,无法将泛型参数Map当作泛型类型使用
type Resolve<T, K extends keyof Map, Map extends SomeMap<T>> = {
  result: Map<T>[K];
};

硬编码的可行但缺乏复用性的实现:

type ResolveWorks<T, K extends keyof SomeMap<T>> = {
  result: SomeMap<T>[K];
};

解决方案:基于映射类型约束的通用实现

核心思路是让Resolve直接接受具体的映射类型作为泛型参数,而非拆分传入值类型和映射构造器。通过泛型约束确保传入的类型符合「字符串键+统一值类型」的结构,从而实现对任意同类映射的适配。

通用Resolve类型定义

type Resolve<M extends { [key: string]: unknown }, K extends keyof M> = {
  result: M[K];
};

适配不同映射类型的示例

// 原有的SomeMap
type SomeMap<T> = { [key: string]: T };
// 另一个自定义映射类型
type UserMap = { [key: string]: { id: number; name: string } };

// 适配SomeMap<number>
type NumResult = Resolve<SomeMap<number>, "count">;
// 类型结果:{ result: number }

// 适配UserMap
type UserResult = Resolve<UserMap, "alice">;
// 类型结果:{ result: { id: number; name: string } }

原错误的原因解析

原代码的问题在于:

  1. 泛型参数顺序错误,且将Map作为类型变量的同时,试图以Map<T>的方式调用它——TypeScript中泛型参数是类型变量,不是可实例化的泛型构造器,因此无法这样嵌套使用。
  2. 硬绑定了SomeMap<T>的约束,导致只能适配该特定类型,失去了通用性。

而通用实现通过直接接受已实例化的映射类型M,并约束其结构为{ [key: string]: unknown },既保证了类型安全,又能适配所有符合该结构的映射类型。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 03:25:55