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 } }
原错误的原因解析
原代码的问题在于:
- 泛型参数顺序错误,且将
Map作为类型变量的同时,试图以Map<T>的方式调用它——TypeScript中泛型参数是类型变量,不是可实例化的泛型构造器,因此无法这样嵌套使用。 - 硬绑定了
SomeMap<T>的约束,导致只能适配该特定类型,失去了通用性。
而通用实现通过直接接受已实例化的映射类型M,并约束其结构为{ [key: string]: unknown },既保证了类型安全,又能适配所有符合该结构的映射类型。
内容的提问来源于stack exchange,提问作者Janek Eilts
相关产品推荐
相关产品推荐

