🐢
tsconfigで strict: true か noImplicitAny: false にしたときの ts7053 を解消する
サマリ
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