如何使用 Typescript 编写具有扩展可迭代约束的泛型类型

How to write a generic type with constraint extending iterable with Typescript

我正在尝试写这种类型:

type Pagination<I extends Iterable> = Readonly<{
  seek: number;
  limit: number;
  total: number;
  items: I;
}>;

这样用户可以使用:

Pagination<Map<number, any>>

但这似乎不起作用,因为 Iterable 还需要通用参数。

所以我只剩下

type Pagination<I> = Readonly<{
  seek: number;
  limit: number;
  total: number;
  items: Iterable<I>;
}>;

虽然这也有效,但类型签名现在变成了 Pagination<number>,无法进一步限制应该使用哪种 iterable。

您可以使用可迭代本身的通用参数而不是项目类型,T extends Iterable<any>

type Pagination<I extends Iterable<any>> = Readonly<{
  seek: number;
  limit: number;
  total: number;
  items: I;
}>;

注意:如果您出于某种原因需要项目类型,您可以使用条件类型来提取它:

type Pagination<I extends Iterable<any>> = Readonly<{
  seek: number;
  limit: number;
  total: number;
  items: I;
  current: I extends Iterable<infer Item> ? Item: never
}>;

declare let map: Pagination<Map<string, number>>
map.current // [string, number]

declare let arr: Pagination<string[]>
arr.current // string

Play