#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 Правильно, но, будучи придирчивым, моя правка была сделана до этого ответа — и я все равно оставлю свой ответ для краткого объяснения того, почему версия с любым в вопросе не будет работать.