首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何有不同的基于输入对象的返回类型?

如何有不同的基于输入对象的返回类型?
EN

Stack Overflow用户
提问于 2020-03-09 11:42:56
回答 1查看 33关注 0票数 1

我有一种基于某些文件过滤列表的方法,有时我可以有一个额外的pageNumber和限制来过滤我的列表,并且只获得有限数量的条目。

这就是我在代码中的内容:

代码语言:javascript
代码运行次数:0
运行
复制
public getByFilter(
   fitler?: { [P in keyof T]?: T[P] } & { pageNumber?: number; limit?: number }
 ): Observable<IPagedResult<T>> { // code to filter }

用这种方法

代码语言:javascript
代码运行次数:0
运行
复制
.getByFilter({ ...filters })
      .subscribe((response: IPagedResult<MyClass>) => {
        // do something
      });

我的方法是否有一个返回类型

代码语言:javascript
代码运行次数:0
运行
复制
Observable<T[]>

如果我的筛选器对象不包含pageNumber和限制?

然后用它像

代码语言:javascript
代码运行次数:0
运行
复制
.getByFilter({ ...filters })
      .subscribe((response: MyClass[]) => {
        // do something
      });
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-09 14:40:11

目前只有在实现端进行一些恶意转换才能做到这一点,但是问题正在被跟踪(#24929#22735#22596),并且维护人员将其声明为设计吊装

解决方案是将filter参数定义为泛型参数,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
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> {
    /**/
}

将根据输入是分页筛选器还是基本筛选器来推断返回类型。

这在呼叫端的工作方式与预期一样:

代码语言:javascript
代码运行次数:0
运行
复制
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上正在跟踪的问题):

代码语言:javascript
代码运行次数:0
运行
复制
if ('pageNumber' in filter && 'limit' in filter) {
  return new Observable<IPagedResult<T>>({
     data: this.value,
  }) as any;
}
return this as any;

一个完整的例子可以找到在这个操场上

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60599881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档