#reactjs #typescript
#reactjs #typescript
Вопрос:
Я только что начал небольшой проект сегодня, чтобы изучить TS, и это сводит меня с ума. Я просмотрел пару видеороликов, но ни одно из них не охватывало этот сценарий.
Я извлекаю список фильмов после поиска и пытаюсь отобразить их список в этом файле.
данные должны представлять собой массив объектов, я видел пару примеров, которые определяли каждый ключ, такой как title: строка, rating: число и т. Д
Я не хочу определять каждый ключ, поскольку это займет вечность… все, что я хочу, это проверить, получил ли он массив объектов
моя ошибка заключается в следующем
Property 'Title' does not exist on type '{}'. TS2339
Вот как определяются данные, а затем передаются в приведенный ниже компонент
const [searchResults, setSearchResults] = useState<Array<{}>>([])
MovieList.tsx
import React from "react";
import { Container, Row, Col } from "react-bootstrap";
interface Props {
data: Array<{}>;
}
const MovieList: React.FC<Props> = ({ data }) => {
const renderMovies = () => {
if (data.length !== 0) {
return data.map((movie) => {
return <Row>{movie.Title}</Row>;
});
}
};
return <Container>{renderMovies()}</Container>;
};
export default MovieList;
Все работает так, как ожидалось, если я удалю определения типов из MovieList.tsx
Ответ №1:
Вам не хватает объявления типа в реквизитах вашего компонента. TypeScript не знает, что элементы в data
объекте имеют Title
свойство.
Вы могли бы исправить это, выполнив что-то вроде:
type MovieListProps= {
data: // your type here
}
const MovieList: React.FC<Props> = ({ data }: MovieListProps) => {
...
}
Кроме того, способ, который вы используете useState
, может быть неправильным. Вероятно, это должно быть что-то вроде:
const [searchResults, setSearchResults] = useState<Array<YourTypeHere>>([])
Комментарии:
1. я попробовал ввести MovieListProps= { data: object[{Title:string}]; } получил ошибку типа ‘{ Title: string; }’, которая не может использоваться в качестве типа индекса. TS2538 У меня также есть другой компонент, где мне не нужно было использовать объявление типа, а просто использовать интерфейс. нужен ли здесь тип, потому что это объект?
2. Я не знаю точно, какие у вас реквизиты, но, вероятно, это должно быть что-то вроде
type MovieListProps= { data: {Title:string}[] }