Как я могу создать интерфейс в Typescript для массива

#javascript #node.js #typescript

#javascript #node.js #typescript

Вопрос:

Я хочу создать интерфейс в typescript для получения этих значений:

 {
  "ABANDONED VEH": 4,
  "ADMINISTRATION": 4,
  "ALARM-BUS/RES": 4
}
  

Когда я пытаюсь использовать правильный интерфейс, который я создаю, я получаю сообщение об ошибке:

Тип string не может быть присвоен IMapping

Что я уже пробовал:

 export interface IMapping {
  [key: string]: { value: string };
}

export interface IMapping {
  key: any;
}

[key: string]: string;
  

PS. Вот мой реальный код:

файл interface.ts:

 export interface IMapping {
  [key: string]: number;
}
  

файл, который использует этот интерфейс:

 import { IMapping } from '../interfaces';
const mapping: IMapping =  '{'
    '"ABANDONED VEH": 4,'
    '"ADMINISTRATION": 4"}';
  

Комментарии:

1. export interface IMapping { [key: string]: number; }

2. [key: string] не является особенным просто любой реквизит, который является строкой (это динамический ключ из ES6 type — где ключ является переменной, а не значением), вы не используете то же самое для значения.

3. Вероятно, ошибка связана с тем, что в вашем коде есть var a: IMapping[] = ["foo", {"ABANDONED VEH": 20,...}]; или что-то в этом роде.

4. Проблема в том, что вы используете строку JSON, вам нужно проанализировать строку, чтобы получить объект, используя JSON.parse (который, вероятно, просто возвращает any).

Ответ №1:

Это похоже на ввод ваших данных.

 interface IMapping {
  [key: string]: number;
}

const data: IMapping = {
  "ABANDONED VEH": 4,
  "ADMINISTRATION": 4,
  "ALARM-BUS/RES": 4
};
  

однако неясно, о чем вы говорите arrays (индексируемые), в этом случае вам может понадобиться список IMapping

 const list: IMappings[] = [
  {
    "ABANDONED VEH": 4,
    "ADMINISTRATION": 4,
    "ALARM-BUS/RES": 4
  },
  {
    "ABANDONED VEH": 5,
    "ADMINISTRATION": 5,
    "ALARM-BUS/RES": 5
  },
];
  

Ответ №2:

В соответствии с формой ваших данных, тип значения в вашем интерфейсе должен быть number , а не { value: string } :

 export interface IMapping {
  [key: string]: number;
}
  

Или, если вы хотите указать свойства:

 export interface IMapping {
  'ABANDONED VEH': number,
  'ADMINISTRATION': number,
  'ALARM-BUS/RES': number
}
  

Однако, согласно вашему сообщению об ошибке и вашему коду, вы присваиваете строку объекту типа IMapping , который является недопустимым.

Строка типа не может быть назначена для обмена сообщениями

 const mapping: IMapping =  '{'
    '"ABANDONED VEH": 4,'
    '"ADMINISTRATION": 4"}';
//                      ^ remove this and use JSON.parse()
  

Если вы знаете объект во время компиляции, то используйте буквальное выражение для его определения:

 const mapping: IMapping = {
  "ABANDONED VEH": 4,
  "ADMINISTRATION": 4,
  "ALARM-BUS/RES": 4
}
  

Если ваши данные поступают из API в строковом формате, то используйте для этого JSON.parse():

 const mapping: IMapping = JSON.parse('{"ABANDONED VEH": 4,"ADMINISTRATION": 4,"ALARM-BUS/RES": 4}');
  

Обратите внимание, однако, что ваша строка не является допустимым JSON, у вас есть конечная строка " после последней 4 .

Комментарии:

1. @Rajesh, я не понимаю, что ты имеешь в виду, можешь объяснить?

2. Проверьте мой ответ. Просто объяснил это там

3. @Rajesh, сообщение об ошибке касается не присвоения свойства, а присвоения строки непосредственно объекту, введенному в этот интерфейс (const obj: iMapping = ‘строка’)

4. Я не думал об этом… Неплохо. Я подожду, пока OP прояснит ситуацию, и удалю свой ответ, если это так

Ответ №3:

Ваши значения — это числа, а не строки. Вы должны попробовать:

 export interface IMapping {
  [key: string]: number;
}
  

Ваша вторая версия с типом any не будет работать, потому что вы не использовали скобки — это будет ожидать свойство с ключом name, а не объект, подобный словарю.

Редактировать:

После вашего редактирования очевидно, что вы пытаетесь назначить строку. Вы должны назначить объект напрямую:

 const mapping: IMapping =  {
  "ABANDONED VEH": 4,
  "ADMINISTRATION": 4};
  

Комментарии:

1. Если у вас есть [key"...]: {...} , вы не можете присвоить примитивное значение

2. Я меняю для него и кадры

3. Есть ли какой-либо способ сделать это? @Rajesh

4. верно, я адаптировался с подсказкой от @Rajesh: я не понимал, что вы ожидали сложных объектов в качестве значений в объекте — спасибо!

5. @Rajesh Правильно, но, будучи придирчивым, моя правка была сделана до этого ответа — и я все равно оставлю свой ответ для краткого объяснения того, почему версия с любым в вопросе не будет работать.