TypeScript如何省略空PaginatedUserDTO类简化类型定义
TypeScript 省略分页DTO空中间类的实现方案
你之前尝试的Promise<Type extends Paginated(BusStopDTO)>属于语法错误:泛型约束需要提前声明泛型参数,且Paginated()是运行时的类混入函数,无法直接在类型位置调用获取返回类的实例类型,以下两种方案都可以完全省去创建空PaginatedUserDTO类的冗余步骤:
方案1:一劳永逸定义通用分页类型(推荐)
在你存放Paginated混入函数的公共文件中,额外导出一个通用类型别名:
// 你的Paginated混入函数原有逻辑 export function Paginated<T>(ItemDTO: new () => T) { return class { list: T[]; total: number; pageNum: number; pageSize: number; // 其他你定义的分页字段 } } // 新增这行通用类型定义 export type PaginatedRes<T> = InstanceType<ReturnType<typeof Paginated<T>>>;
后续所有分页接口不需要单独创建空中间类,直接在返回值位置传入对应DTO的类型即可:
// user.service.ts async find(filter?: findArgs): Promise<PaginatedRes<typeof UserDTO>> { const { first, after, last, before, find } = filter; const query = this.User.find(find); // 如果paginate函数返回值类型和定义不匹配,加个轻量类型断言即可:as PaginatedRes<typeof UserDTO> return paginate(query, filter); }
不管有多少个分页DTO,都不需要再写class PaginatedXxxDTO extends Paginated(XxxDTO) {}这类空壳代码。
方案2:内联获取返回类型(不需要改公共文件)
如果不想修改公共文件,直接在返回值位置用TS内置工具类型推导混入类的实例类型即可:
async find(filter?: findArgs): Promise<InstanceType<ReturnType<typeof Paginated<typeof UserDTO>>>> { const { first, after, last, before, find } = filter; const query = this.User.find(find); return paginate(query, filter); }
这种写法不需要额外定义类型,但是返回类型写起来较长,适合临时使用。
注意:如果你的
Paginated混入函数的泛型参数是实例类型而非类构造器类型,只需要把typeof UserDTO换成UserDTO即可,根据你自己的Paginated函数签名调整。
内容的提问来源于stack exchange,提问作者Kuramori Reika
相关产品推荐
相关产品推荐

