React / TypeScript: свойство ‘actorsList’ не существует для типа ‘MoviePoster’. TS2339

#javascript #reactjs #typescript #jsx

#javascript #reactjs #typescript #jsx

Вопрос:

Я пытаюсь создать список актеров (в основном, отображающих теги li в react) для постера фильма в react, однако я получаю сообщение об ошибке, как описано в названии (полное сообщение ниже), и не уверен, что я делаю неправильно.

Интерфейс:

   export interface MoviePoster {
  title: string;
  posterUrl: string;
  videoUrl: string;
  description: string;
  actorsList: string[];
}
  

Компонент posterCard:

 const PosterCard = (props: PosterCardProps) => {
const [isHover, setIsHover] = useState(false);
  const { posterUrl, title, description, actorsList } = props.moviePoster;
  const actors = actorsList.map((actor) => <li key={actor}>{actor}</li>);
return (
    <>
      <div style={styles.container} onMouseEnter={() => setIsHover(true)} onMouseLeave={() => setIsHover(false)}>
          <ul>{actors}</ul>
        </div>
      </div>
      <MovieSnippetPopUp moviePoster={props.moviePoster} isHovered={isHover} />
    </>
  );
};
  

Домашняя страница, на которой я использую компонент PosterCard:

 const HomePage = (props: HomePageProps): JSX.Element => {
  const { theme } = props;

  const styles: Styles = {
    container: {
      background: theme.BACKGROUND,
      height: '100%',
      width: '100%',
    },
  };

  return (
    <div style={styles.container}>
      <Header theme={theme} />
      <PosterGrid
        moviePosters={[
          {
            posterUrl: 'https://images-na.ssl-images-amazon.com/images/I/61rv%2BRnsu6L._AC_.jpg',
            title: 'Avenger',
            videoUrl: '',
            description: 'Avenger',
            actorsList: ['Thor', 'Bob', 'Joe'],
          },
        ]}
      />
    </div>
  );
};
  

PosterGrid:

 interface PosterGridProps {
  moviePosters: MoviePoster[]; //Creating an array of MoviePoster objects
}

const PosterGrid = (props: PosterGridProps): JSX.Element => {
  const { moviePosters } = props;

  const styles: Styles = {
    container: {
      display: 'block',
      height: 'fit-content',
      width: 'fit-content',
      padding: 'auto 0',
    },
    topPosterCardsContainer: {
      display: 'flex',
      height: 'fit-content',
      width: 'fit-content',
    },
    bottomPosterCardsContainer: {
      display: 'flex',
      height: 'fit-content',
      width: 'fit-content',
    },
  };

  const moviePosterCardsTop = moviePosters.map((value) => <PosterCard moviePoster={value} />).slice(0, 3);
  const moviePosterCardsBottom = moviePosters.map((value) => <PosterCard moviePoster={value} />).slice(3);

  return (
    <div style={styles.container}>
      <div style={styles.topPosterCardsContainer}>{moviePosterCardsTop}</div>
      <div style={styles.bottomPosterCardsContainer}>{moviePosterCardsBottom}</div>
    </div>
  );
  

Сообщение об ошибке 1:

 Property 'actorsList' does not exist on type 'MoviePoster'.  TS2339

    13 | const PosterCard = (props: PosterCardProps) => {
    14 |   const [isHover, setIsHover] = useState(false);
  > 15 |   const { posterUrl, title, description, actorsList } = props.moviePoster;
       |                                          ^
    16 |   const actors = actorsList.map((actor) => <li>{actor}</li>);
    17 | 
    18 |   const styles: Styles = {
  

Сообщение об ошибке2:

 index.js:1 Warning: Each child in a list should have a unique "key" prop.
  

По сути, чтобы создать некоторые теги списка в react, я создал список строк, которые будут содержать все имена актеров в интерфейсе MoviePoster, а затем отображать каждый элемент в этом списке в теге list.

Комментарии:

1. Это может быть глупый ответ, но на всякий случай: вы сохранили все отредактированные файлы? Поскольку ошибка, похоже, связана с интерфейсом, и, как я вижу из ваших фрагментов, это правильно

2. @Danielo да, я сохранял несколько раз, просто чтобы быть уверенным

3. так что, возможно, ts неправильно передается. Вы пытались остановить tsc watcher и затем перезапустить?

4. @Danielo Я сомневаюсь, что что-то не так с передачей ts. Я использовал элемент inspect и обнаружил другую ошибку: index.js:1 Предупреждение: У каждого дочернего элемента в списке должен быть уникальный реквизит «key». Я обновлю вопрос

5. о, лол, я не заметил: вы пытаетесь получить доступ к реквизиту, но это массив: « [ { posterUrl: ‘ images-na.ssl-images-amazon.com/images/I/61rv+Rnsu6L._AC_.jpg ‘, заголовок: ‘Avenger’, видеозапись: «, описание: ‘Avenger’, список актеров: [‘Тор’, ‘Боб’, ‘Джо’], }, ] ` `