向本地存储在TypeScript中的JSON对象添加类型

向本地存储在TypeScript中的JSON对象添加类型,json,typescript,Json,Typescript,这是本地存储的JSON对象 { "data": { "John Doe": {"id":"1234", "username":"johndoe"}, "Sia Xander": {"id":"1235", "username":"siax"} } } 这是我

这是本地存储的JSON对象

{
"data": {
    "John Doe": {"id":"1234", "username":"johndoe"},
    "Sia Xander": {"id":"1235", "username":"siax"}
  }
}
这是我拥有的TypeScript文件,我创建了这个函数,但它出错了

import { data } from "../Assets/data.json"

function createData(member: string, id: string, username: string) {
    return { member, id, username }
  }

interface Rows {
    member: string
    id: string
    username: string
  }

const rows: Rows[] = []

Object.keys(data).map(member =>
    rows.push(
      createData(
        member,
        data[member]["id"], //error
        data[member]["username"] //error
      )
    )
  )
我得到以下错误

Element implicitly has an 'any' type because expression of type 'string' can't be used to index type "data": {
    "John Doe": {"id":string, "username":string},
    "Sia Xander": {"id":string, "username":string}
  }
}
 No index signature with a parameter of type 'string' was found on type

"data": {
    "John Doe": {"id": string , "username":string},
    "Sia Xander": {"id":string, "username":string}
  }
}
我如何告诉TypeScript“John Doe”和“Sia Xander”是字符串? 或者我应该改变我制作JSON的方式吗 为什么它不起作用: 这不起作用,因为
Object.keys()
可以返回其参数类型上不存在的键。有关更多详细信息,请参阅


相反,什么会起作用: 相反,请尝试使用
对象。条目

Object.entries(data).map(([member, memberData]) =>
  rows.push(
    createData(
      member,
      memberData["id"],
      memberData["username"]
    )
  )
);
Object.entries
返回键值对,因此您不需要自己进行查找。有关更多信息,请参阅


此外,您还可以以更简单的方式使用
.map
: 您使用
.map
的方式很有效,但您可以使其更简单

返回数组,因此不需要使用
push()

相反,请尝试以下方法:

const rows: Rows[] = Object.entries(data).map(([member, memberData]) =>
  createData(
    member,
    memberData["id"],
    memberData["username"]
  )
);

谢谢你的回答!我已经挣扎了一段时间了,我还不熟悉打字。这个解决方案是如此干净和简单,只是喜欢它。