Когда TypeScript транслируется в TypeScript, его система типов стирается ; все аннотации типов, утверждения и объявления удаляются из кода. Компилятор TypeScript не превращает let info: Info;
в какой-либо инициализационный JavaScript; он просто удаляет часть : Info
. Это означает, что ваш код будет выглядеть примерно так:
let info;
info.name = {"key": responseData.name};
Это будет ошибка времени выполнения, потому что info
будет undefined
, когда вы попытаетесь добавить к нему свойство. Вам нужно инициализировать info
в TypeScript, как и в JavaScript.
Вы не можете написать let info: Info = {}
, потому что компилятор (справедливо) будет жаловаться, что пустой объект не является Info
. Самый простой способ продолжить - использовать утверждение типа , чтобы сообщить компилятору, что пустой объект, который вы инициализируете, будет в конечном итоге будет действительным Info
:
let info = {} as Info;
Это не очень типобезопасно, поскольку, если вы забудете инициализировать все свойства, компилятор не предупредит вас:
let info = {} as Info;
//info.name = { "key": responseData.name }; <-- oops forgot this
info.name.key.toUpperCase(); // runtime error but no compiler error
Поэтому утверждений типов лучше избегать, если вы можете реорганизовать что-то проверяемый тип сейф; например, лучший подход - инициализировать info
как действительный Info
с самого начала:
let info: Info = {
name: { "key": responseData.name },
price: responseData.price,
labels: responseData.labels
}
console.log(info);
Хорошо, надеюсь, это поможет; удачи!
Детская площадка ссылка на код