我有一种基于某些文件过滤列表的方法,有时我可以有一个额外的pageNumber和限制来过滤我的列表,并且只获得有限数量的条目。
这就是我在代码中的内容:
public getByFilter(
fitler?: { [P in keyof T]?: T[P] } & { pageNumber?: number; limit?: number }
): Observable<IPagedResult<T>> { // code to filter }
用这种方法
.getByFilter({ ...filters })
.subscribe((response: IPagedResult<MyClass>) => {
// do something
});
我的方法是否有一个返回类型
Observable<T[]>
如果我的筛选器对象不包含pageNumber和限制?
然后用它像
.getByFilter({ ...filters })
.subscribe((response: MyClass[]) => {
// do something
});
发布于 2020-03-09 06:40:11
目前只有在实现端进行一些恶意转换才能做到这一点,但是问题正在被跟踪(#24929、#22735、#22596),并且维护人员将其声明为设计吊装。
解决方案是将filter
参数定义为泛型参数,如下所示:
type BasicFilter<T> = { [P in keyof T]?: T[P] };
type PaginationFilter<T> = BasicFilter<T> & { pageNumber: number, limit: number };
type Filter<T> = BasicFilter<T> | PaginationFilter<T>;
public getByFilter<F extends Filter<T>>(filter: F): F extends PaginationFilter<T> ? Observable<IPagedResult<T>> : Observable<T> {
/**/
}
将根据输入是分页筛选器还是基本筛选器来推断返回类型。
这在呼叫端的工作方式与预期一样:
const paged = new Observable<Test>({foo: 1, bar: ''}).getByFilter({
pageNumber: 2,
limit: 2,
});
// paged as type: Observable<IPagedResult<Test>>
const raw = new Observable<Test>({foo: 1, bar: ''}).getByFilter({});
// raw as type: Observable<Test>
在实现方面,您需要这样的断言as any
(在GitHub上正在跟踪的问题):
if ('pageNumber' in filter && 'limit' in filter) {
return new Observable<IPagedResult<T>>({
data: this.value,
}) as any;
}
return this as any;
一个完整的例子可以找到在这个操场上。
https://stackoverflow.com/questions/60599881
复制相似问题