#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. Вы должны отправить ссылку сюда и отметить меня.