Типизация функции, работающей с разными типами данных

Есть функция, работающая с массивами, содержащими 2 типа данных (дженерик): Movie<Image>[] или Movie<string>[], так как она использует одинаковые поля, имеющиеся у них.

Использую вложенные интерфейсы, так как на вход поступает массив вложенных объектов - movies, который затем сохраняется в БД измененным (остаются нужные поля, убирается вложенность) и опять используется, как savedMovies. Дженерик и поля с ? используются, чтобы применить Movie и там, и там.

interface Image {
  url:string;
  formats:Formats
}

interface Formats {
  thumbnail:Thumbnail
}

interface Thumbnail {
  url:string;
}

interface Movie<T> {
  id?: number;
  movieId?:number;
  nameRU: string;
  nameEN: string;
  director: string;
  country: string;
  year: string;
  duration: number;
  description: string;
  trailerLink?: string;
  created_at: string;
  updated_at: string;
  image: T;
  thumbnail?:string;
  trailer?:string;
  owner?:number;
}

Сама функция:

  function findMovies(movies: Movie<Image>[]|Movie<string>[], word:string, isChecked:Boolean) {
    return movies.filter((movie) => {
      return finder(movie, word, isChecked);
    });
  }

Соответственно, возвращает она тоже:

 Movie<Image>[]|Movie<string>[]

Результат ее выполнения используют 2 других функции:

  function handleUpdateFindWord(word:string, isChecked:Boolean) {
    const filteredRes: Movie<Image>[] = findMovies(movies, word, isChecked);
    ...
  }

и

  function handleFindSavedMovies(word:string, isChecked:Boolean) {
    const filteredMovies: Movie<string>[] = findMovies(savedMovies, word, isChecked);
    ...
  }

Но обе они ожидают от findMovies НЕ Movie<Image>[]|Movie<string>[], а что-то одно:

Type '(Movie<Image> | Movie<string>)[]' is not assignable to type 'Movie<Image>[]'.
  Type 'Movie<Image> | Movie<string>' is not assignable to type 'Movie<Image>'.
    Type 'Movie<string>' is not assignable to type 'Movie<Image>'.
      Type 'string' is not assignable to type 'Image'.ts(2322)

Я понял, что могу создать отдельную функцию, типа findMovies для второго типа, чтобы не использовать Movie<Image>[]|Movie<string>[] в них. Или добавить Movie<Image>[]|Movie<string>[] в обе функции, но дальше эти данные идут в другие функции по цепочке и теряется смысл от создания дженерика. Есть ли какой-нибудь другой способ типизации здесь?


Ответы (0 шт):