Подтвердить что ты не робот

Как я могу определить массив объектов?

Я создаю массив объектов в TypeScript:

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

Может кто-нибудь сказать мне, как я мог бы правильно объявить его тип? Можно ли сделать inline или мне нужно два определения?

Я пытаюсь заменить xxx на объявление типа, чтобы позже TypeScript предупредил меня, если я по ошибке использовал что-то вроде userTestStatus[3].nammme.

4b9b3361

Ответ 1

Вам лучше использовать собственный массив вместо литерала объекта с числовыми свойствами, так что нумерация (как и многие другие функции массива) позаботится о готовом продукте.

Здесь вы ищете определение встроенного интерфейса для вашего массива, которое определяет каждый элемент в этом массиве, независимо от того, присутствует он изначально или представлен позже:

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

Ответ 2

То, что у вас есть выше, - это объект, а не массив.

Чтобы сделать массив, используйте [ и ], чтобы окружить ваши объекты.

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

Ответ 3

То, что вы действительно хотите, может просто быть перечислением

Если вы ищете что-то, что ведет себя как перечисление (потому что я вижу, что вы определяете объект и присоединяете последовательный идентификатор 0, 1, 2 и содержит поле имени, которое вы не хотите опечатывать (например, имя vs naaame), вам лучше определить перечисление, потому что последовательный идентификатор автоматически обрабатывается и предоставляет вам проверку типа из коробки.

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")
]

Ответ 4

Некоторые правила 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" }
);