如何定义对象数组?

新手上路,请多包涵

我在 TypeScript 中创建一个对象数组:

  userTestStatus xxxx = {
    "0": { "id": 0, "name": "Available" },
    "1": { "id": 1, "name": "Ready" },
    "2": { "id": 2, "name": "Started" }
 };

有人能告诉我如何正确声明它的类型吗?是否可以内联或我需要两个定义?

我希望用类型声明替换 xxx ,以便稍后如果我错误地使用了 userTestStatus[3].nammme 类的东西,TypeScript 会提醒我。

原文由 user1679941 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

您最好使用 本机数组 而不是具有类似数字属性的对象文字,以便编号(以及许多其他数组函数)现成可用。

您在这里寻找的是数组的内联 接口 定义,它定义了该数组中的每个元素,无论是最初存在还是后来引入:

 let userTestStatus: { id: number, name: string }[] = [
    { "id": 0, "name": "Available" },
    { "id": 1, "name": "Ready" },
    { "id": 2, "name": "Started" }
];

userTestStatus[34978].nammme; // Error: Property 'nammme' does not exist on type [...]

如果您立即使用值初始化数组,则不需要显式类型定义; TypeScript 可以从初始赋值中自动推断出大多数元素类型:

 let userTestStatus = [
    { "id": 0, "name": "Available" },
    ...
];

userTestStatus[34978].nammme; // Error: Property 'nammme' does not exist on type [...]

原文由 John Weisz 发布,翻译遵循 CC BY-SA 4.0 许可协议

有点旧,但我觉得我可以为此添加一些清晰度。

确切答案

    interface MyObject {
      id: number;
      name: string;
    }

    interface MyExactData {
      [key: string]: MyObject;
    }

    let userTestStatus: MyExactData = {
      "0": { "id": 0, "name": "Available" },
      "1": { "id": 1, "name": "Ready" },
      "2": { "id": 2, "name": "Started" }
    };

但是上面不是我们通常做对象数组的方式,你会在 javaScript 中使用简单的原生数组。

     interface MyObject { // define the object (singular)
      id: number;
      name: string;
    }

    let userTestStatus_better: MyObject[] = [
      { "id": 0, "name": "Available" },
      { "id": 1, "name": "Ready" },
      { "id": 2, "name": "Started" }
    ];

只需将 [] 添加到我们的界面即可为所述对象数组提供类型。并内联做到这一点

    let userTestStatus_inline: {id:number, name:string}[] = [
      { "id": 0, "name": "Available" },
      { "id": 1, "name": "Ready" },
      { "id": 2, "name": "Started" }
    ];

我会使用界面,因为您有一些可定义、可理解和可重用的东西。如果您需要进行更改,您可以对一个界面进行更改,打字稿将报告您的界面代码不匹配。

原文由 Eddie 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
logo
Stack Overflow 翻译
子站问答
访问
宣传栏