Создание объектов с использованием интерфейса для типов JSON в typescript

#javascript #json #typescript

#javascript #json #typescript

Вопрос:

Мне трудно понять, как формируются типы объектов с учетом JSON. Например, у меня есть этот объект JSON, для которого мне нужно сформировать тип.

 // "Spokane, WA": {
  //   "My M": "M-Spokane-WA.json",
  //   "MY D": "D-Spokane-WA.json"
  // },
  // "Pondera, MT": {
  //   "My M": "M-Pondera-MT.json",
  //   "MY D": "D-Pondera-MT.json"
  // },
  

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

 export interface IStateType {
cityState: string {   // "Spokane, WA" is in quotes so seems like is coming in string.
My M :string  // "My M" is string .. How to show the  "M-Spokane-WA.json" part???
MY D: string  
}
}
  

оказалось, что это правильный способ выразить это

 export interface IStateType  {
     [cityState: string]: {
        ["My M"]: string;
        ["MY D"]: string;
      };
}
  

Может кто-нибудь, пожалуйста, объяснить, почему мы используем [] для cityState и почему вокруг моих M и My D есть кавычки, но не вокруг cityState?

————— Udpate 2 Из ссылки на подпись индекса

 interface StringArray {
  [index: number]: string;  // It says string is a return type..
}

let myArray: StringArray;
myArray = ["Bob", "Fred"];  // Is this the return mentioned above :string?

let myStr: string = myArray[0];  // Is myArray[0] this the [index:number] part of interfaces StringArray? 
  

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

1. Это не JavaScript. Пожалуйста, отметьте правильно.

2. @amadan, разве это не ванильный JS? Как вы хотите, чтобы я пометил это как?

3. Вещи, которых нет в JavaScript: интерфейсы, объявления типов, тип с именем string (нижний регистр). Я бы предположил, что это TypeScript (или, возможно, какая-то связанная производная)… но вы должны лучше меня знать, какой язык вы используете.

4. Изменено на typescript, спасибо..

5. Потому что именно так работает TypeScript, например, typescriptlang.org/docs/handbook /. My M само по себе не является допустимым идентификатором JavaScript, поэтому оно должно быть в кавычках.

Ответ №1:

Давайте разберем определение интерфейса.

 export interface IStateType  {
    [cityState: string]: <some value type definition>,
}
  

Здесь у нас определена сигнатура индекса. Подпись индекса позволяет интерфейсу иметь бесконечное количество свойств, соответствующих точному типу. Ключ должен иметь string тип, а значение должно быть <some value type definition>

Тогда вместо <some value type definition> , это на самом деле:

 {
    ["My M"]: string;
    ["MY D"]: string;
};
  

Это то же самое, что

 {
    "My M": string;
    "MY D": string;
};
  

Вы должны использовать кавычки вокруг My M и My D , потому что в строке есть пробелы. Если нет пробелов, вы могли бы использовать MyM and MyD напрямую, без кавычек.


Вы не можете использовать ["cityState"] вместо [cityState: string] , потому что именно так вы определяете подпись индекса.

Причина, по которой вы должны использовать [cityState: string] вместо cityState: string , заключается в том, что это позволяет передавать объект JSON произвольного числа городов-штатов и просто работает. Ваше исходное определение интерфейса принимает только один город-штат.


РЕДАКТИРОВАНИЕ 1: Примеры

Я вижу некоторые очевидные ошибки в вашем коде, поэтому вот исправленная версия.

 interface StringArray {
  [index: number]: string;
}

let myArray: StringArray;
myArray = {0: "Fred"};

let myStr: string = myArray[0]; // "Fred"
  

Каждое свойство в myArray должно иметь number as key и string as value . Это определено в коде [index: number]: string . Остальное не требует пояснений, imo.


Вот еще один пример:

 let myArray2: StringArray;
myArray2 = {
  4: "hello",
  7: "world",
  3643728: "enjoy",
  1: "good",
  5.2: "luck",  // 5.2 is a number
};

console.log(myArray2[5.2]); // Logs "luck"
  

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

1. Это лучшее объяснение, которое я получил. Большое вам спасибо! У меня есть еще несколько вопросов по этому поводу, если все в порядке. Ссылка для подписи индекса, которую вы отправили.. Я обновляю свой пост.

2. Пожалуйста, воздержитесь от цикла обновления вопроса / обновления ответа @Sarah и Timmy. Это несправедливо по отношению к другим людям, которые могут прийти с другими ответами на исходный вопрос, а переполнение стека предназначено для одного вопроса => ответов «один ко многим».

3. @HereticMonkey На самом деле я думал об этом, но вместо того, чтобы заставить Сару создать еще один вопрос / сообщение, вопрос, который она задала, связан с моим ответом. Она в основном просит меня ответить на исходный вопрос с более подробной информацией и добавить пример. Я думаю, что было бы более полезно для всех, чтобы я обновил исходный ответ и добавил больше деталей.

4. @Sarah, добро пожаловать. Просто отметьте меня, и я, возможно, проверю новый пост.

5. Вы должны отправить ссылку сюда и отметить меня.