解决泛型的泛型

问题描述 投票:0回答:1

我正在尝试在 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;
};
javascript typescript generics mapped-types
1个回答
0
投票

最终解决方案: 这里我传入了预定义的泛型。

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;
};
© www.soinside.com 2019 - 2024. All rights reserved.