如何在typescript中定义对象数组?

151 typescript

我创建了这个对象数组.有人能告诉我如何在打字稿中定义这些吗?是否可以进行内联或我需要两个定义?

 userTestStatus xxxx = {
    "0": { "id": 0, "name": "Available" },
    "1": { "id": 1, "name": "Ready" },
    "2": { "id": 2, "name": "Started" }
 };
Run Code Online (Sandbox Code Playgroud)

我想用一个定义替换"xxx"(我认为这是正确的单词).因此,如果我错误地使用了像userTestStatus [3] .nammme这样的东西,那么后来的Typescript会提醒我.

Joh*_*isz 223

最好使用本机数组而不是具有类似数字属性的对象文字,这样编号(以及许多其他数组函数)就可以得到现成的处理.

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

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 [...]
Run Code Online (Sandbox Code Playgroud)

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

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

userTestStatus[34978].nammme; // Error: Property 'nammme' does not exist on type [...]
Run Code Online (Sandbox Code Playgroud)

  • 向我们展示一个添加方法。一次分配全部并不总是可能的 (3认同)
  • 你也可以这样声明一个对象数组:`let someArray:Array <{id:number,name:string}> = [] (2认同)

Bro*_*cco 62

你上面的是一个对象,而不是一个数组.

使数组使用[&]围绕对象.

userTestStatus = [
  { "id": 0, "name": "Available" },
  { "id": 1, "name": "Ready" },
  { "id": 2, "name": "Started" }
];
Run Code Online (Sandbox Code Playgroud)

除此之外,TypeScript是JavaScript的超集,因此无论什么是有效的JavaScript都是有效的TypeScript,因此不需要进行其他更改.

来自OP的反馈澄清......需要对发布的模型进行定义

您可以使用此处定义的类型来表示对象模型:

type MyType = {
    id: number;
    name: string;
}

type MyGroupType = {
    [key:string]: MyType;
}

var obj: MyGroupType = {
    "0": { "id": 0, "name": "Available" },
    "1": { "id": 1, "name": "Ready" },
    "2": { "id": 2, "name": "Started" }
};
// or if you make it an array
var arr: MyType[] = [
    { "id": 0, "name": "Available" },
    { "id": 1, "name": "Ready" },
    { "id": 2, "name": "Started" }
];
Run Code Online (Sandbox Code Playgroud)


Edd*_*die 28

有点旧,但我觉得我可以对此进行一些澄清。

确切答案

    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" }
    };

Run Code Online (Sandbox Code Playgroud)

但上面不是我们通常处理对象数组的方式,您可以在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" }
    ];

Run Code Online (Sandbox Code Playgroud)

只需添加[]到我们的界面即可提供所述对象数组的类型。并内联执行此操作

    let userTestStatus_inline: {id:number, name:string}[] = [
      { "id": 0, "name": "Available" },
      { "id": 1, "name": "Ready" },
      { "id": 2, "name": "Started" }
    ];
Run Code Online (Sandbox Code Playgroud)

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


小智 25

Array<T>

person: Array<{
  name: string;
  age: number;
}>
Run Code Online (Sandbox Code Playgroud)

  • 请尝试解释您的答案,而不仅仅是提供代码——这有助于 OP 学习,也有助于其他访问您答案的人。 (9认同)

Ogg*_*las 20

一些tslint规则禁止使用[],示例消息:Array type using 'T[]' is forbidden for non-simple types. Use 'Array<T>' instead.

然后你会写它像:

var userTestStatus: Array<{ id: number, name: string }> = Array(
    { "id": 0, "name": "Available" },
    { "id": 1, "name": "Ready" },
    { "id": 2, "name": "Started" }
);
Run Code Online (Sandbox Code Playgroud)

  • 有史以来最实用的方法。对于简单的数组用例来说,它是简单直接的解决方案。采纳我的+1 (3认同)

bak*_*kal 14

你真正想要的可能只是一个枚举

如果你正在寻找一个行为类似于枚举的东西(因为我看到你正在定义一个对象并附加一个顺序ID 0,1,2并包含一个你不想拼错的名字字段(例如name vs naaame)最好定义一个枚举,因为顺序ID会自动处理,并为您提供开箱即用的类型验证.

enum TestStatus {
    Available,     // 0
    Ready,         // 1
    Started,       // 2
}

class Test {
    status: TestStatus
}

var test = new Test();
test.status = TestStatus.Available; // type and spelling is checked for you,
                                    // and the sequence ID is automatic
Run Code Online (Sandbox Code Playgroud)

上面的值将自动映射,例如"0"表示"可用",您可以使用它们访问它们TestStatus.Available.并且当你传递它们时,Typescript将强制执行该类型.

如果您坚持将新类型定义为自定义类型的数组

你想要一个对象数组(不完全是一个带有键"0","1"和"2"的对象),所以让我们定义对象的类型,首先是一个包含数组的类型.

class TestStatus {
    id: number
    name: string

    constructor(id, name){
        this.id = id;
        this.name = name;
    }
}

type Statuses = Array<TestStatus>;

var statuses: Statuses = [
    new TestStatus(0, "Available"),
    new TestStatus(1, "Ready"),
    new TestStatus(2, "Started")
]
Run Code Online (Sandbox Code Playgroud)