問題
以下のようなコードを書くと、data[key]
でエラーになる。
const data = {
apple: 'ringo',
organge: 'mikan',
pear: 'nashi'
}
const rows = Object.keys(data).map((key) => {
return { key, value: data[key] }
})
Element implicitly has an 'any' type because expression of type 'string' can't be used to index type '{ apple: string; organge: string; pear: string; }'.
No index signature with a parameter of type 'string' was found on type '{ apple: string; organge: string; pear: string; }'.
理由
Object.keys
の返り値がstring[]
になるけど、data[key]
したときにdata
のindexが列挙型なので、string
と不一致するため。
対策
keyofを使うといい。
type Data = {
apple: string,
orange: string,
pear: string
}
const data: Data = {
apple: 'ringo',
orange: 'mikan',
pear: 'nashi'
}
const rows = (Object.keys(data) as (keyof Data)[]).map((key) => {
return { key, value: data[key] }
})
keyof
で指定した型のキーを列挙した型を返してくれる。
Object.keys(data) as (keyof Data)
することで、data
のキーの列挙型が帰ってくるので、それを配列にしてから.map
に渡せばkey
が列挙型になりエラーにならなくなるという