【问题标题】:Why does (Observable<T>) => Observable<R> resolve as OperatorFunction<T, R>为什么 (Observable<T>) => Observable<R> 解析为 OperatorFunction<T, R>
【发布时间】:2021-08-14 15:59:31
【问题描述】:

来自ng-bootstrap documentation的示例代码:

查看示例“维基百科搜索”,点击“>代码”并选择文件“typeahead-http.ts”。

  search: OperatorFunction<string, readonly string[]> = (text$: Observable<string>) =>
    text$.pipe(
      debounceTime(300),
      distinctUntilChanged(),
      tap(() => this.searching = true),
      switchMap(term =>
        this._service.search(term).pipe(
          tap(() => this.searchFailed = false),
          catchError(() => {
            this.searchFailed = true;
            return of([]);
          }))
      ),
      tap(() => this.searching = false)
    )

以及OperatorFunction的定义来自RxJS documentation

interface OperatorFunction<T, R> extends UnaryFunction, Observable> {

  // inherited from index/UnaryFunction
  (source: T): R
}

为什么search的类型可以声明为:

  • OperatorFunction&lt;string, string[]&gt;

根据定义是:

  • (param: string): string[]

然后分配给带有签名的箭头函数

  • (param: Observable&lt;string&gt;): Observable&lt;string[]&gt;

尝试将Observable&lt;T&gt; 分配给T 不应该有冲突吗?我在这里想念什么?箭头函数search的实际返回类型是什么?

【问题讨论】:

标签: angular typescript rxjs ng-bootstrap rxjs-observables


【解决方案1】:

缺少打开 &lt; 的文档页面。

所以OperatorFunction被定义为(https://github.com/ReactiveX/rxjs/blob/7.1.0/src/internal/types.ts#L23):

export interface OperatorFunction<T, R> extends UnaryFunction<Observable<T>, Observable<R>> {}

然后UnaryFunction 被声明为 (https://github.com/ReactiveX/rxjs/blob/7.1.0/src/internal/types.ts#L19-L21):

export interface UnaryFunction<T, R> {
  (source: T): R;
}

这意味着search 被声明为:

(source: Observable<string>): Observable<string[]>;

【讨论】:

  • 嘿,你说得对。检查文档的 HTML 显示第一个 Observable&lt;T&gt; 被解析为 HTML,这解释了为什么它在视觉上丢失。我误以为最后一个&gt;是错字,界面extends UnaryFunction, Observable
猜你喜欢
  • 2019-01-31
  • 2019-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-01
  • 2021-12-01
  • 1970-01-01
相关资源
最近更新 更多