значения.
Обычная схема: map().reduce().filter()
Но у объекта интерфейс, где поле genres: string[] | null | undefined
Сделал так:
export const findUniqueGenres = (movies: Movie[]) => {
return movies
.map((movie) => movie.genres)
.reduce((prev, curr) => prev?.concat(curr), [])
?.filter((item, i, arr) => arr.indexOf(item) === i);
};
Ошибка в concat(curr), ему не нравится сам curr, ts(2769) - в общем, ему не нравится, что может быть undefined | null.
Но если я добавляю перед map() filter(), в котором проверяю genres != null && Array.isArray(movie.genres) - ошибка никуда не девается, хотя у меня тут уже гарантированно не будет ни null, ни undefined.
Без typescript делал подобное много раз, никаких проблем, тут именно ts ругается.
Сделал другой вариант:
export const findUniqueGenres = (movies: Movie[]) => {
return movies
.map((movie) => movie.genres)
.reduce((prev, curr) => {
if (curr) return prev?.concat(curr);
}, [])
?.filter((item, i, arr) => arr.indexOf(item) === i);
};
Здесь warning на reduce, мол, стрелочная функция всегда должна что-то возвращать. Оно работает, в рантайме не падает, но хотелось бы убрать warning.
Подскажите, пожалуйста, как это поправить можно?
Ворнинг из-за того что функция может не возвращать ничего, у вас ретёрн в ифе. Зачем для prev у вас ?. непонятно, в рантайме оно работает неправильно. Решение в сообщении выше (не моем)
Обсуждают сегодня