Потому что this.request(id) возвращает или faceProductList[][] или faceProductList[].
А array.filter(({title}) => title.includes(valueSearch)) однозначно обрабатывает данные как faceProductList[] и не учитывает faceProductList[][].
Можно сделать
public async handler(id: string, valueSearch: string) {
await this.request(id)
.then((array: faceProductList[]) => {
...
для того чтоб ошибка ушла.
Но проблема неоднозначности останется и однажды вылезет в виде бага.
На вашем месте я бы сделал как-то так:
public async request(id: string): Promise<faceProductList[][]> {
const res = await fetch(`${this.url}${id}`);
const resArr: faceProductList[] | faceProductList[][] = await res.json();
if (resArr.length === 0) {
return resArr;
}
if (Array.isArray(resArr[0])) {
return resArr;
}
return [resArr];
}
не могу гарантировать что это заработает сразу, возможно прийдётся подпилить. Но направление мысли должно быть понятным.
Плюс этого подхода - вы будете избавлены от проверки на "а что именно вернула request, faceProductList[] или faceProductList[][] ?" при каждом чихе.