Присвоение данных объекта интерфейсу машинописного текста вызывает ошибку - PullRequest
0 голосов
/ 17 июня 2020

В настоящее время я сталкиваюсь с проблемой, когда пытаюсь присвоить значения свойствам интерфейса. Я получаю эту ошибку: "Variable 'info' is used before being assigned."

Мой код выглядит так:

export interface Info {
        name: ProductName;
        price: number;
        labels?: string[];
}

export interface ProductName {
    key: string;
}

let responseData = 
{ name: "dummy",price: 123, labels: ["red", "small"]};

let info: Info;
info.name = {"key": responseData.name};
info.price = responseData.price;
info.labels = responseData.labels;
console.log(info);

Было бы здорово, если бы кто-нибудь мог мне помочь с этой проблемой :)

1 Ответ

0 голосов
/ 17 июня 2020

Когда 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);

Хорошо, надеюсь, это поможет; удачи!

Детская площадка ссылка на код

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...