@laravel_creative_3103

По какой причине выдает ошибка в TypeScript?

Имеется интерфейс, в котором указаны следующие:

export interface Post {
  title: string;
  text: string;
}


Также имеется переменная, которая реализует данный интерфейс:
AllPosts: Post[] = [
    { title: 'Компьютер', text: 'Это самый лучший компьютер' },
    { title: 'Ноутбук', text: 'Ноутбук это то, через чего удобно работать' },
    { title: 'Телефон', text: 'Сейчас все сидят в инстаграмме и телеграамме' },
  ];


Пытаюсь реализовать метод transform, и компилятор выкидывает ошибку:

export class SearchingPipe implements PipeTransform {
  transform(posts: Post[], search: string, searhcField: string = 'title') {
    if (!search.trim()) {
      return posts;
    }

    return posts.filter((post) => {
     
      return post[searhcField] //вот здесь такое сообщение:
//Элемент неявно имеет тип "any", так как выражение типа "string" не может использоваться для индексации типа "Post".
//В типе "Post" не обнаружена сигнатура индекса с параметром типа "string".ts(7053)
        .toLocaleLowerCase()
        .includes(search.toLocaleLowerCase());
    });
  }
}


Нужно ли мне в интерфейсе или же в самом методе что-то дополнить, чтоб устранить ошибку?
  • Вопрос задан
  • 320 просмотров
Решения вопроса 2
yarkov
@yarkov
Помог ответ? Отметь решением.
А так?
searhcField: keyof Post
Ответ написан
@karminski
Senior React.JS Developer
export interface Post {
  [key: string]: string;
  title: string;
  text: string;
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
bingo347
@bingo347 Куратор тега TypeScript
Crazy on performance...
function isPostField(field: string): field is keyof Post {
  return field === 'title' || field === 'text';
}

export class SearchingPipe implements PipeTransform {
  transform(posts: Post[], search: string, searhcField: string = 'title') {
    if (!isPostField(searhcField) || !search.trim()) {
      return posts;
    }

    return posts.filter((post) => {
     
      return post[searhcField]
        .toLocaleLowerCase()
        .includes(search.toLocaleLowerCase());
    });
  }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы