我正在尝试编写这种类型:
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
关于typescript - 如何使用 Typescript 编写具有扩展可迭代约束的泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58061848/