はじめに
TypeScript使ってて、任意のオブジェクトが持つ、キーでループさせたいときがあります。
すると、どうしてもブラケット使わなくちゃならない。Object[key]みたいな。
そういうことするとTypeScriptはえらいから、
Element implicitly has an 'any' type because type 'typeof *****' has no index signature.
なんて言って、注意してくれるわけですよ、これを回避したい。
サンプルコード
const Foo = {
one: 1,
two: 2,
three: 3,
four: 4,
five: 5,
};
const bar: object = Object.keys(Foo).reduce((acc: any, key: any) => {
acc[key] = Foo[key];
return acc;
}, {});
コンパイルすると、
Element implicitly has an 'any' type because type 'typeof Foo' has no index signature.
って言う。あーうぜえ。
回避する方法
const Foo = {
one: 1,
two: 2,
three: 3,
four: 4,
five: 5,
};
const bar: object = Object.keys(Foo).reduce((acc: any, key: any) => {
acc[key] = Foo[key as keyof typeof Foo];
return acc;
}, {});
keyを"keyof typeof Foo"でasしてやる。
ここでのkeyはFooの要素だよってコンパイラに教えてやるってことらしい。
なんかキモイけどしょうがない。
参考
https://github.com/microsoft/TypeScript/issues/19137
https://typescript-jp.gitbook.io/deep-dive/type-system/moving-types#knokyapucha
https://qiita.com/gonta/items/fb7b9e6d0f12060c27d6
https://qiita.com/Nossa/items/e01d0bce67b760c0bcb9