我正在尝试写这种类型的东西:
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>
,无法进一步限制应使用哪种可迭代类型。
答案 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