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

标签 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>没有办法进一步限制应该使用哪种迭代。

最佳答案

您可以使用可迭代本身的通用参数而不是项目类型,使用 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

关于typescript - 如何使用 Typescript 编写具有扩展可迭代约束的泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58061848/

相关文章:

typescript - 为泛型函数特化一个类型

typescript - 通用类型扩展联合不会被类型保护缩小

来自接口(interface)实现的 Typescript 泛型推断

typescript - 强制 Typescript 通用参数(a : T, B: T)为相同类型

javascript - 类型 'void' 不可分配给类型 '((event: MouseEvent<HTMLInputElement>) => void) | undefined'

reactjs - 如何在zod中制作自定义错误消息?

typescript - 可选的链接运算符奇怪的行为

javascript - 导致代码更改的 lint 错误但不确定如何继续

Typescript:是否可以确保键和内部值是相同的字符串?

typescript - 如何检查Google Play订阅在客户端或服务器端是否处于事件状态