我正在尝试在 TypeScript 中创建一个可重用的实用程序类型,它可以与任何符合通用结构的地图类型一起使用。这是我的基本设置:
type SomeMap<T> = {
[key: string]: T;
};
我需要定义一个 Resolve 类型,它可以动态地与扩展 SomeMap 的任何地图类型一起使用。这是我的尝试,导致错误:
type Resolve<T, K extends keyof Map, Map extends SomeMap<T>> = {
result: Map<T>[K]; // Syntax error: can only be: Map[K]
};
这会失败,因为 TypeScript 不直接支持这种形式的泛型嵌套或约束。我正在寻找一种方法,使 Resolve 能够处理与 SomeMap 匹配的任何类型,而无需将地图类型硬编码到 Resolve 定义中。
显然,可以通过以下方式对地图进行硬编码:
type ResolveWorks<T, K extends keyof SomeMap<T>> = {
result: SomeMap<T>[K];
};
但是,这种方法并不能满足我的要求,因为它缺乏可重用性——我需要一个能够适应不同地图结构而不直接指定 SomeMap 的解决方案。
编辑:
如果有人感兴趣: 我最终确实像这样解决了这个问题: 基本上是预定义泛型。
type IsString<T> = T extends string ? true : false;
type IsNumber<T> = T extends number ? true : false;
type Resolve<T, HS, HN> = IsString<T> extends true
? HS
: IsNumber<T> extends true
? HN
: never;
type HandleString<T> = {
type: 'string';
v: T;
};
type HandleNumber<T> = {
type: 'number';
v: T;
};
最终解决方案: 这里我传入了预定义的泛型。
type IsString<T> = T extends string ? true : false;
type IsNumber<T> = T extends number ? true : false;
type Resolve<T, HS, HN> = IsString<T> extends true
? HS
: IsNumber<T> extends true
? HN
: never;
type HandleString<T> = {
type: 'string';
v: T;
};
type HandleNumber<T> = {
type: 'number';
v: T;
};