You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular 14使用mediaObserver报错:Observable与Subscription类型不匹配

问题修复方案

错误原因

Angular 14的类型检查机制比12更严格,你当前直接将Observable<void>类型的数据流赋值给了类型为Subscription的变量cols,两者类型不匹配,触发了类型错误。

修复方式

根据cols的实际用途,有两种修复路径:

路径1:cols用于存储订阅实例(后续需取消订阅)

如果cols是用来保存订阅对象、方便组件销毁时取消订阅的,需要订阅Observable,将返回的Subscription赋值给cols:

// 先明确cols的类型为Subscription
private cols: Subscription;

// 订阅Observable,将返回的订阅实例赋值给cols
this.cols = this.mediaObserver.asObservable().pipe(
  map((change: MediaChange[]) => {
    this.deviceAlias = change[0].mqAlias;
    // 若需要根据设备类型生成列配置,可在此返回对应配置
    // return this.getColumnsForDevice(this.deviceAlias);
  })
).subscribe((columns) => {
  // 若map中有返回列配置,在此将配置赋值给实际用于渲染的变量
  // this.displayColumns = columns;
});

// 组件销毁时记得取消订阅(可选,若用async管道可省略)
ngOnDestroy() {
  this.cols?.unsubscribe();
}

路径2:cols用于存储UI列配置

如果cols是用来给模板提供列配置数据的,需要将cols声明为Observable类型,并配合模板的async管道使用:

// 声明cols为对应列类型的Observable(替换YourColumnType为实际列类型)
cols: Observable<YourColumnType[]>;

this.cols = this.mediaObserver.asObservable().pipe(
  map((change: MediaChange[]) => {
    this.deviceAlias = change[0].mqAlias;
    // 根据设备类型返回对应的列配置
    switch(this.deviceAlias) {
      case 'xs':
        return [{ field: 'id', header: 'ID' }, { field: 'name', header: '名称' }];
      case 'md':
        return [{ field: 'id', header: 'ID' }, { field: 'name', header: '名称' }, { field: 'status', header: '状态' }];
      default:
        return [{ field: 'id', header: 'ID' }, { field: 'name', header: '名称' }, { field: 'status', header: '状态' }, { field: 'operation', header: '操作' }];
    }
  })
);

在模板中使用async管道自动订阅/取消订阅:

<ng-container *ngFor="let col of cols | async">
  <!-- 列渲染逻辑 -->
</ng-container>

内容的提问来源于stack exchange,提问作者RRB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 13:51:14