javascript - 使用 typescript 中 JSON 类型的接口创建对象
问题描述
我很难理解给定 JSON 的对象类型是如何形成的。例如,我有这个 JSON 对象,我需要为其形成一个类型。
// "Spokane, WA": {
// "My M": "M-Spokane-WA.json",
// "MY D": "D-Spokane-WA.json"
// },
// "Pondera, MT": {
// "My M": "M-Pondera-MT.json",
// "MY D": "D-Pondera-MT.json"
// },
我遵循的规则是在创建对象时复制 JSON,然后为变量命名。最后我有这样的事情。
export interface IStateType {
cityState: string { // "Spokane, WA" is in quotes so seems like is coming in string.
My M :string // "My M" is string .. How to show the "M-Spokane-WA.json" part???
MY D: string
}
}
原来这是正确的说法
export interface IStateType {
[cityState: string]: {
["My M"]: string;
["MY D"]: string;
};
}
有人可以解释一下为什么我们使用 [] 表示 cityState 以及为什么在 My M 和 My D 周围有引号,但在 cityState 周围没有引号?
--------------- 更新 2 来自索引签名上的链接
interface StringArray {
[index: number]: string; // It says string is a return type..
}
let myArray: StringArray;
myArray = ["Bob", "Fred"]; // Is this the return mentioned above :string?
let myStr: string = myArray[0]; // Is myArray[0] this the [index:number] part of interfaces StringArray?
解决方案
让我们反汇编接口定义。
export interface IStateType {
[cityState: string]: <some value type definition>,
}
我们在这里定义了一个索引签名。索引签名使接口能够具有与确切类型匹配的无限数量的属性。键必须是string
类型,值必须是<some value type definition>
然后<some value type definition>
,它实际上是:
{
["My M"]: string;
["MY D"]: string;
};
这与
{
"My M": string;
"MY D": string;
};
您必须使用引号My M
,My D
因为字符串中有空格。如果没有空格,您可以直接使用MyM
and MyD
,不带引号。
您不能使用["cityState"]
instead of [cityState: string]
,因为这是您定义索引签名的方式。
您必须使用[cityState: string]
而不是的原因cityState: string
是因为这可以让您传递任意数量的城市状态的 JSON 对象并且可以正常工作。您的原始接口定义仅接受一个城市州。
编辑 1:示例
我在您的代码中看到了一些明显的错误,所以这里是更正的版本。
interface StringArray {
[index: number]: string;
}
let myArray: StringArray;
myArray = {0: "Fred"};
let myStr: string = myArray[0]; // "Fred"
中的每个属性都myArray
需要有一个number
askey
和string
as value
。这是在代码中定义的[index: number]: string
。其余的是不言自明的imo。
这是另一个例子:
let myArray2: StringArray;
myArray2 = {
4: "hello",
7: "world",
3643728: "enjoy",
1: "good",
5.2: "luck", // 5.2 is a number
};
console.log(myArray2[5.2]); // Logs "luck"
推荐阅读
- node.js - 有问题。邮政。评论模式 - Mongoose/Typescript
- mongodb - MongoDB - 如何在插入时引用父级中的子级/嵌套文档_id
- haskell - 如何确定一个 Enum 值是否是另一个 Enum 值的后继值?
- docker - 下载 Hyperledger Fabric docker 图像时遇到问题
- reactjs - 使用 Enzyme 更改 React 功能组件的 Props
- javascript - 如何将两个字段组合成第三个标签?
- azure - 在 Azure App Service for Containers 上启用 gzip 压缩
- xamarin - Xam.Plugin.Media 获取路径
- python-3.x - Keras CNN:任何 batch_size > 1 的不兼容形状 [batch_size*2,1] 与 [batch_size,1]
- python - validation_split 如何训练神经网络模型?