在Typescript中声明JSON对象的正确方法

时间:2016-06-30 12:33:43

标签: typescript angular

我的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': []
              }
            ]
  }
]

3 个答案:

答案 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