开发者问题收集

如何修复“对象可能未定义”以及为什么我会收到这个错误?

2022-01-30
1067

因此 Typescript 会将 this.ratesMap.get(rate[0]) 加下划线,并告知它可能未定义。添加 ! 可解决问题,我不再收到错误,但代码无法正常工作,输出为空,终端和控制台中没有其他错误。

为什么 Typescript 会将 this.ratesMap.get(rate[0]) 加下划线,而不是 this.ratesMap.has(rate[0]) ?我该如何修复?

export class CardStore implements ICardStore {
  public lastRates: ICard[] = [];

  @observable
  public cardsArray: CurrencyCard[] = []

  @observable
  private ratesMap: Map<string, CurrencyCard> = new Map<string, CurrencyCard>();
  
  public constructor(@inject(CardApi) private api: CardApi) {
    makeObservable(this);
    this.getRates();
    this.updateRate();
  }

  @computed
  public get recentRates(): CurrencyCard[] {
    return this.cardsArray = [...this.ratesMap.values()]
  }

  private async getRates() {
    const rates = await this.api.loadRates();
    runInAction(() => {
      Object.entries(rates).forEach((rate) => {
        if (this.ratesMap.has(rate[0])) {
          this.ratesMap.get(rate[0]).update(rate[1]);
        } else {
          let newCard = new CurrencyCard(rate[0], rate[1]);
          this.ratesMap.set(rate[0], newCard);
        }
      });    
    });
  }

loadrates() 来自上述代码,位于此处:

        public async loadRates(): Promise<Record<string, number>> {
            return await fetch(
                `https://freecurrencyapi.net/api/v2/latest?apikey=MYAPIKEY&base_currency=USD`
            )
            .then(response => response.json())
            .then(data => (data.data)); 
            }
}
1个回答

Mapget 方法的返回值可能为 undefined (如果映射中没有该键的条目)。TypeScript 不知道您已使用 has 调用防止了这种情况。

相反,不要使用 has (执行 has + get 通常是一种反模式 [一种几乎无害的模式 🙂],它会强制遍历映射两次)。获取卡片并检查是否获得了一张:

private async getRates() {
  const rates = await this.api.loadRates();
  runInAction(() => {
    Object.entries(rates).forEach((rate) => {
      const card = this.ratesMap.get(rate[0]);  // ***
      if (card) {                               // ***
        card.update(rate[1]);                   // ***
      } else {
        let newCard = new CurrencyCard(rate[0], rate[1]);
        this.ratesMap.set(rate[0], newCard);
      }
    });    
  });
}

TypeScript 将能够根据 if (card) 缩小 card 的类型,因此它会知道 cardif 主体中不是 undefined ,并且会允许您对其使用 update

T.J. Crowder
2022-01-30