ChatGPT解决这个技术问题 Extra ChatGPT

如何定义对象数组?

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

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

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

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


A
AmerO

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

您在此处查找的是数组的内联 interface 定义,该定义定义了该数组中的每个元素,无论是最初存在还是后来引入:

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 [...]

您也可以这样声明对象数组:let someArray: Array<{ id: number, name: string }> = []
向我们展示一个 add 方法。一次全部分配并不总是可能的
@Sujoy 与 JS 中的相同,即 userTestStatus.push - 根据初始分配或类型定义,它也是类型安全的。
B
Brocco

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

要创建一个数组,请使用 [ & ] 包围您的对象。

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

除此之外,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" }
];

对不起,也许我的问题不清楚。我想做的是找到 userTestStatus 的定义。
@Marilou 您通常只需将鼠标悬停在您最喜欢的 IDE 中的 userTestStatus 变量上即可获得定义...... TypeScript 游乐场显示 { id: number, name: string; }[]。如果您喜欢 interface NameThis { id: number, name: string; }NameThis[] 作为数组类型,您可以将其包装在一个接口中。
我试过这个,但它给了我一些错误。但是我认为这就像我想要的那样: userTestStatus: { id: number, name: string; }[] = {“0”:{“id”:0,“名称”:“可用”},“1”:{“id”:1,“名称”:“准备好”},
在您定义 var arr: MyType 的示例中,您不会使用 "0": { … } 等属性名称/索引声明;此时您只需使用对象文字。
@gfullam 你是对的,我更新了我的答案(这是一个快速粗心的编辑)
O
Ogglas

一些 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" }
);

P
Penny Liu

Array<T>

person: Array<{
  name: string;
  age: number;
}>

请尝试解释您的答案,而不仅仅是提供代码 - 这有助于 OP 学习并帮助其他访问您的答案的人。
这就是我要找的。对象数组
b
bakkal

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

如果您正在寻找行为类似于枚举的东西(因为我看到您正在定义一个对象并附加一个顺序 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

上面的值将自动映射,例如“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")
]

对不起,也许我的问题不清楚。我想做的是找到 userTestStatus 的定义,以便 Typescript 允许我检查它的使用位置,例如我无法输入 userTestStatus[1].naaaame。
我想在“userTestStatus”和“=”之间找到一些东西。就像我可能会在其中放置字符串或数字来说明变量具有什么类型一样。像 Brocco 这样的东西刚刚做了,但如果可能的话,只用一条线。
E
Eddie

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

确切答案

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

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


您的回答帮助我理解声明对象的行数据类型。谢谢
A
Akash Singh

你也可以试试

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

    let userTestStatus:Record<string,IData> = {
        "0": { "id": 0, "name": "Available" },
        "1": { "id": 1, "name": "Ready" },
        "2": { "id": 2, "name": "Started" }
    };

要检查记录的工作方式:https://www.typescriptlang.org/docs/handbook/utility-types.html#recordkt

在我们的例子中,Record 用于声明一个对象,其键是字符串,值是 IData 类型,所以现在它会在我们尝试访问其属性时为我们提供智能感知,并在我们尝试时抛出类型错误类似 userTestStatus[0].nameee


您应该提供更多信息,说明为什么这可以解决手头的问题
A
Aitkulov Nursultan
 var xxxx : { [key:number]: MyType };