Typescript, преобразующий JSON в string — тип string, не может быть присвоен type = ‘{ .. }’

#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;