“MonoTypeOperatorFunction<any>”类型的参数不可分配给“UnaryFunction<Obs​​ervable<any>, Observable

Posted

技术标签:

【中文标题】“MonoTypeOperatorFunction<any>”类型的参数不可分配给“UnaryFunction<Obs​​ervable<any>, Observable<any>>”类型的参数【英文标题】:Argument of type 'MonoTypeOperatorFunction<any>' is not assignable to parameter of type 'UnaryFunction<Observable<any>, Observable<any>>' 【发布时间】:2019-01-09 19:08:10 【问题描述】:

我正在尝试从 rxjs 5 迁移到 6,但我遇到了困难。当我尝试这个时

this._connectivity.isOnline().pipe(first()).subscribe((state) => 
  this.syncCheck(user.uid);
);

我收到了这个错误

Argument of type 'MonoTypeOperatorFunction<any>' is not assignable to parameter of type 'UnaryFunction<Observable<any>, Observable<any>>'.
  Types of parameters 'source' and 'source' are incompatible.
    Type 'import("/home/User/Desktop/projectname/node_modules/rxjs/Observable").Observable<any>' is not assignable to type 'import("/home/User/Desktop/projectname/node_modules/rxjs/internal/Observable").Observable<a...'.
      Property 'map' is missing in type 'Observable<any>'.

【问题讨论】:

您能显示此代码 sn-p 的导入吗? 【参考方案1】:

您似乎对 isOnline() 返回类型有错误的导入。确保始终从rxjs 导入,而不是从rxjs/internal 甚至rxjs/internal/Observable 导入。 (first()等运算符必须从rxjs/operators导入)

【讨论】:

是的!谢谢,这个答案救了我。在 VSCode 中,我从错误的库中自动导入了 map(),却没有意识到这一点。如果您遇到类型怪异,则值得检查导入。【参考方案2】:

我的代码发现了同样的错误:

let source = of([1, 2, 3, 45, 56, 7, 7])
    .pipe(
        filter((x: number) => x % 2 == 0)
    );

TS2345:“MonoTypeOperatorFunction”类型的参数不可分配给“OperatorFunction”类型的参数。

要解决这个问题,请从过滤函数中删除类型

 filter(x => x % 2 == 0)

现在你有错误

算术运算的左侧必须是“任意”、“数字”类型,因此请确保这个烦人的过滤器获得正确的数据类型

filter(x => Number(x) % 2 == 0) // parse element to number

但现在代码停止工作。最后,为了解决这个问题,从一开始就改成 to from。

let source = from([1, 2, 3, 45, 56, 7, 7])
    .pipe(
        filter((x: number) => Number(x) % 2 === 0)
    )

let source = of(1, 2, 3, 45, 56, 7, 7)
.pipe(
        filter((x: number) => Number(x) % 2 === 0)
    )

所以,错误的原因是我的初始数据结构。

我认为,我的示例可以帮助您处理类似的问题。

【讨论】:

【参考方案3】:

我有这样的问题,第一次扫描不起作用, 所以我 变了

  .pipe(scan((count ) => count + 1, 0))...

  .pipe(scan((count:any ) => count + 1, 0))

然后问题还在于 Rxjs 也安装在此应用程序的父文件夹中。所以删除这个,我相信已经解决了这个问题。

使用npm-check 包是清理npm 包的全局和本地级别问题的好主意。

【讨论】:

【参考方案4】:

我在一种 HTTP 服务方法中使用管道时遇到了类似的错误(参见底部的示例)。问题是缺少输入订阅中使用的回调函数。在您的情况下,在state 中添加输入(不是最好的主意,甚至是any)或删除括号:

解决方案 1:

this._connectivity.isOnline()
  .pipe(first()).subscribe((state: any) => 
    this.syncCheck(user.uid);
);

解决方案 2:

this._connectivity.isOnline()
  .pipe(first()).subscribe(state => 
    this.syncCheck(user.uid);
);

回到我的案例,我使用管道记录数据。需要为 observable 设置两种可能的类型,然后可以输入回调函数:

  public getPrice(): Observable<string | PriceDTO> 
    return this.http.get<PriceDTO>(`api/price)
      .pipe(
        tap((data: PriceDTO) => console.log('PRICE: ', data)),
        catchError((val: Error) => of(`I caught: $val`))
      );
  

【讨论】:

以上是关于“MonoTypeOperatorFunction<any>”类型的参数不可分配给“UnaryFunction<Obs​​ervable<any>, Observable的主要内容,如果未能解决你的问题,请参考以下文章