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

CMC*_*kai 5 typescript typescript-generics

我正在尝试写这种类型:

type Pagination<I extends Iterable> = Readonly<{
  seek: number;
  limit: number;
  total: number;
  items: I;
}>;
Run Code Online (Sandbox Code Playgroud)

这样用户就可以使用:

Pagination<Map<number, any>>
Run Code Online (Sandbox Code Playgroud)

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

所以我只剩下

type Pagination<I> = Readonly<{
  seek: number;
  limit: number;
  total: number;
  items: Iterable<I>;
}>;
Run Code Online (Sandbox Code Playgroud)

尽管这也有效,但类型签名现在Pagination<number>无法进一步限制应该使用哪种类型的迭代。

Tit*_*mir 2

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

type Pagination<I extends Iterable<any>> = Readonly<{
  seek: number;
  limit: number;
  total: number;
  items: I;
}>;
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)