#javascript #typescript #vue.js
#javascript #typescript #vue.js
Вопрос:
У меня есть этот код:
interface ISource extends IdModel {
source_type_id: number;
network_id: number;
company_connection_id: number;
feed_id: number;
connection_id: number;
feed_ids: number[];
name: string;
tag: string;
additional_data: ISourceData;
default_user_image?: File;
hasNewImage?: boolean;
next_update?: string;
post_field_overrides?: {
user_full_name?: string;
user_screen_name?: string;
url?: string;
network_id?: number;
};
}
save() {
//converting this to string because I am saving this in my database.
this.source.post_field_overrides = JSON.stringify(this.source.post_field_overrides);
}
Если я не преобразую это в string , это значение, которое сохраняется в моей базе [Object object]
данных .
Если я также преобразую это в String, я получаю эту ошибку / предупреждение:
TS2322: Type 'string' is not assignable to type '{ user_full_name?: string | undefined; user_screen_name?: string | undefined; url?: string | undefined; network_id?: number | undefined; } | undefined'.
Любая помощь по этому вопросу, пожалуйста? Заранее спасибо!
Комментарии:
1.
post_field_overrides?
не является ни string, ни any … Вы должны решить, что вы хотите, чтобы это было, и написать, что я думаю…2. вы пробовали это?: JSON.stringify(JSON.parse(this.source.post_field_overrides));
Ответ №1:
this.source.post_field_overrides = JSON.stringify(this.source.post_field_overrides);
вы определили post_field_overrides как объект, содержащий
{
user_full_name?: string;
user_screen_name?: string;
url?: string;
network_id?: number;
}
в вашем интерфейсе typescript. теперь вы хотите заменить тот же атрибут строкой. это не пройдет проверку статического типа typescript.
если вам нужно, чтобы это была строка, добавьте другой атрибут в свой интерфейс.
или, как сказал Алексей Левенков, используйте это вместо этого для поддержки как объекта, так и строки
post_field_overrides?: string | {
user_full_name?: string;
user_screen_name?: string;
url?: string;
network_id?: number;
};
Комментарии:
1. Этот действительно хорош! Спасибо за это! Другая проблема заключается в том, что когда я извлекаю данные из базы данных, поскольку это строка, я должен получить
JSON.parse()
ее в тот момент, когда я ее извлек. Вот как я его анализирую —this.source.post_field_overrides = JSON.parse(this.source.post_field_overrides);
проблема в том, что я снова получаю ошибкуTS2345: Argument of type 'string |
— как это сделать?2. Я думаю, когда вы используете JSON.parse для преобразования строки в object, проверка типа typescript просто увидит его как объект JSON, а не тип
{ user_full_name: ...}
, который вы определили в интерфейсе. Поэтому вам может потребоваться абстрагировать это определение типа как независимый тип PostFieldOverride, используйте его в интерфейсе, а также в этом месте сJSON.parse(this.source.post_field_overrides) as PostFieldOverride
Ответ №2:
Вы объявляете post_field_overrides
как объект
post_field_overrides?: {
user_full_name?: string;
user_screen_name?: string;
url?: string;
network_id?: number;
};
если вам нужно использовать его как строку, вам нужно объявить как:
post_field_overrides?: string;