如何编写具有TypeScript可扩展约束的泛型类型

时间:2019-09-23 11:50:48

标签: typescript typescript-generics

我正在尝试写这种类型的东西:

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>,无法进一步限制应使用哪种可迭代类型。

1 个答案:

答案 0 :(得分:1)

您可以使用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

相关问题