【问题标题】:Angular - Argument of type 'ISiteInfo | null' is not assignable to parameter of type 'ISiteInfo | undefined'Angular - 'ISiteInfo | 类型的参数null' 不能分配给“ISiteInfo |”类型的参数不明确的'
【发布时间】:2021-07-11 09:31:24
【问题描述】:

在我的 Angular-12 应用程序中,我有这个模型接口:

export interface ISiteInfo {
  id: number;
  name: string;
  email: string;
}

And also this service:

import {ISiteInfo} from '../models/site-info.model';

export class SiteInfoService {

  private infoSiteSource = new BehaviorSubject < ISiteInfo | null > (null);
  infoSite = this.infoSiteSource.asObservable();

  setInfoSite(data: ISiteInfo) {
    this.infoSiteSource.next(data);
  }

  constructor(
    private http: HttpClient,
    private api: ApiService,
  ) {}

  public get(refresh: boolean = false): Observable < ISiteInfo > {
    return new Observable(observer => {
      if (!refresh && this.infoSiteSource.getValue()) {
        observer.next(this.infoSiteSource.getValue());
        return observer.complete();
      }
      this.http.get < ISiteInfo > (this.api.baseURL + '/GInfoSite').subscribe(value => {
        this.setInfoSite(value);
        observer.next(this.infoSiteSource.getValue());
        observer.complete();
      });
    });
  }
}

我收到了这个错误:

'ISiteInfo | 类型的参数null' 不能分配给“ISiteInfo |”类型的参数不明确的'。 类型 'null' 不可分配给类型 'ISiteInfo |未定义'.ts(2345)

这一行突出显示:

this.infoSiteSource.getValue()

observer.next(this.infoSiteSource.getValue());

另外,当我从以下位置删除 |null 时:

私人 infoSiteSource = new BehaviorSubject(null);

错误改为:

“null”类型的参数不可分配给“ISiteInfo”类型的参数。ts(2345)

我该如何解决这个问题?

谢谢

【问题讨论】:

    标签: angular typescript rxjs


    【解决方案1】:

    如果你尝试这个,它会改变什么吗:

    private infoSiteSource = new BehaviorSubject < ISiteInfo | undefined > (undefined);
    

    此外,您的 get 方法似乎支持刷新选项。我经常使用另一个 Observable 完成刷新功能,如下所示:

      // To support a refresh feature
      private refresh = new BehaviorSubject<boolean>(true);
    
      products$ = this.refresh
        .pipe(
          mergeMap(() => this.http.get<Product[]>(this.productsUrl)
            .pipe(
              tap(data => console.log('Products', JSON.stringify(data))),
              catchError(this.handleError)
            )
          ));
    

    (对于毫无疑问会编辑这篇文章的人......希望你在编辑这个“希望这有帮助”时获得很多 SO 积分!)

    【讨论】:

      【解决方案2】:

      私人 infoSiteSource = 新的 BehaviorSubject (null);

      【讨论】:

      猜你喜欢
      • 2021-07-05
      • 2022-06-23
      • 2018-04-05
      • 2021-12-04
      • 1970-01-01
      • 2021-09-30
      • 2021-12-22
      • 1970-01-01
      • 2021-11-20
      相关资源
      最近更新 更多