Как я могу определить массив объектов?
Я создаю массив объектов в TypeScript:
userTestStatus xxxx = {
"0": { "id": 0, "name": "Available" },
"1": { "id": 1, "name": "Ready" },
"2": { "id": 2, "name": "Started" }
};
Может кто-нибудь сказать мне, как я мог бы правильно объявить его тип? Можно ли сделать inline или мне нужно два определения?
Я пытаюсь заменить xxx
на объявление типа, чтобы позже TypeScript предупредил меня, если я по ошибке использовал что-то вроде userTestStatus[3].nammme
.
Ответы
Ответ 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" }
);