Типизация функции, работающей с разными типами данных
Есть функция, работающая с массивами, содержащими 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>[] в обе функции, но дальше эти данные идут в другие функции по цепочке и теряется смысл от создания дженерика. Есть ли какой-нибудь другой способ типизации здесь?