1. ホーム
  2. typescript

[解決済み】「TS2532: Object is possibly 'undefined'」というエラーを解決するにはどうしたらいいですか?

2022-02-10 17:44:32

質問

Firebase Cloud Functions と Firestore を使用する Web アプリのサンプルを再構築しようとしています。関数をデプロイすると、次のエラーが発生します。

src/index.ts:45:18 - error TS2532: Object is possibly 'undefined'.
45     const data = change.after.data();

これがその機能です。

export const archiveChat = functions.firestore
  .document("chats/{chatId}")
  .onUpdate(change => {
    const data = change.after.data();

    const maxLen = 100;
    const msgLen = data.messages.length;
    const charLen = JSON.stringify(data).length;

    const batch = db.batch();

    if (charLen >= 10000 || msgLen >= maxLen) {

      // Always delete at least 1 message
      const deleteCount = msgLen - maxLen <= 0 ? 1 : msgLen - maxLen
      data.messages.splice(0, deleteCount);

      const ref = db.collection("chats").doc(change.after.id);

      batch.set(ref, data, { merge: true });

      return batch.commit();
    } else {
      return null;
    }
  });

関数をデプロイしてテストしようとしているところです。そして、すでに同様の問題をウェブで検索しましたが、私の問題に一致する他の投稿を見つけることができませんでした。

解決方法を教えてください。

TypeScript 3.7のリリースで、オプションのチェーニング( ? 演算子) が正式に利用可能になりました。

そのため、式を次のように簡略化することができます。

const data = change?.after?.data();

詳しくは、そのバージョンの リリースノート そのバージョンでリリースされた他の興味深い機能をカバーしています。

以下を実行して、TypeScriptの最新の安定版リリースをインストールします。

npm install typescript

とはいうものの オプショナル・チェイニング と一緒に使用することができます。 Nullish Coalescing を処理する際のフォールバック値として使用します。 null または undefined

const data = change?.after?.data() ?? someOtherData();


追加ポイント

条件付きでオプショナル・チェイニングを使用する場合 if ステートメントを使用する場合でも、適切な値/型の等質性チェックを行う必要があります。

厳密なTypeScriptでは、以下のようにすると失敗する。未定義の値と数値を比較している可能性があるからだ。

if (_?.childs?.length > 0) 

そのかわり、こうすればいいのです。

if (_?.childs && _.childs.length > 0)