🐢

tsconfigで strict: true か noImplicitAny: false にしたときの ts7053 を解消する

2024/09/10に公開

サマリ

TypeScriptでreduceメソッドを使用したとき、掲題のtsconfig.jsonの設定を実施するとts7053が発生したので解消方法を記載します。

エラー内容

プレーンオブジェクトのアキュムレータに、プロパティを追加すると以下のエラーとなります:

ts7053
Element implicitly has an 'any' type because expression of type 'string' can't be used to index type '{}'.

解消方法

型アサーションを使う方法もありますが、今回は型ガードで解消しました。

まず、以下のガード関数を定義します(今回はプロパティをstring限定にします):

type ObjectWithStringKey = {
  [k in string]: unknown;
};

function assertObjectWithStringKeyOrEmpty(
  obj: object
): asserts obj is ObjectWithStringKey {
  if (Object.keys(obj).some((element) => typeof element !== "string")) {
    throw new Error("object key must be string!");
  }
}

次に、ガード関数をreduceに適用します

Object.keys(obj).reduce((acc, key) => {
    assertObjectWithStringKeyOrEmpty(acc); // <-- ガード関数を適用
    acc[key] = 'value'; // <-- ts7053が解消される
    return acc;
  }, {});

感想

Object.keys()の返却値がstringの配列になるので、typeof stringはあまり意味がない気がしました。

reduceメソッドは便利なので、これからも多用したいです。

Discussion