我的Angular 2应用程序中有以下JSON对象,并且想知道在typescript中声明它的正确方法。
data = [
{
'id':1,
'title':'something'
'node': [
{
'id':1,
'title':'something'
'node': []
}
]
},
{
'id':2,
'title':'something'
'node': [
{
'id':1,
'title':'something'
'node': []
}
]
}
]
答案 0 :(得分:14)
以下是您要求的简单而幼稚的实现:
interface IDataNode {
id: number;
title: string;
node: Array<IDataNode>;
}
如果要从代码中实例化所述节点:
class DataNode implements IDataNode {
id: number;
title: string;
node: Array<IDataNode>;
constructor(id: number, title: string, node?: Array<IDataNode>) {
this.id = id;
this.title = title;
this.node = node || [];
}
addNode(node: IDataNode): void {
this.node.push(node);
}
}
使用它来硬编码您的结构:
let data: Array<IDataNode> = [
new DataNode(1, 'something', [
new DataNode(2, 'something inner'),
new DataNode(3, 'something more')
]),
new DataNode(4, 'sibling 1'),
new DataNode(5, 'sibling 2', [
new DataNode(6, 'child'),
new DataNode(7, 'another child', [
new DataNode(8, 'even deeper nested')
])
])
];
答案 1 :(得分:6)
正确的方法是使用界面,在编译为javascript时它不会生成额外的代码,它为您提供静态输入功能:
https://www.typescriptlang.org/docs/handbook/interfaces.html
答案 2 :(得分:1)
我意识到这是一个老问题,但是我刚刚找到了一个对我来说非常有效的解决方案。声明以下内容
type JsonPrimitive = string | number | boolean | null
interface JsonMap extends Record<string, JsonPrimitive | JsonArray | JsonMap> {}
interface JsonArray extends Array<JsonPrimitive | JsonArray | JsonMap> {}
type Json = JsonPrimitive | JsonMap | JsonArray
那么以下任何一项(包括因语法错误而稍作修改的OP版本)都将起作用
let a: Json = {};
a[1] = 5;
a["abc"] = "abc";
a = {
a: {
a: 2,
},
b: [1, 2, 3],
c: true,
};
a = [
{
"id": 1,
"title": "something",
"node": [
{
"id": 1,
"title": "something",
"node": [],
},
],
},
{
"id": 2,
"title": "something",
"node": [
{
"id": 1,
"title": "something",
"node": [],
},
],
},
];
这个答案应该归功于Andrew Kaiser,他在有关将Json变成Typescript基本类型的讨论中提出了建议:https://github.com/microsoft/TypeScript/issues/1897#issuecomment-648484759