Как определить интерфейс машинописи для массива на объектах

#reactjs #typescript

Вопрос:

Вот данные с сервера.

введите описание изображения здесь

Я хочу отобразить его с помощью карты в пользовательском интерфейсе.

Вот интерфейс, который я сделал —

 export interface IHistory {  reports: Readonlylt;{  readonly id?: string,  status?: Status,  readonly created_at?: Date,  }gt; }[];  

Карта, которую я делаю:

 {props.history!.map((index, idx) =gt; {}  

Ошибка:

Ошибка типа: Не удается прочитать свойства null (чтение «карты»)

Что я делаю не так? Я хочу отображать только отчеты.

введите описание изображения здесь

Добавлен —

Интерфейс —

 export interface IHistory {  reports: Arraylt;{  id?: string;  status?: Status;  created_at?: string;  }gt;; };  const [ hitoryState, setHistoryState ] = useStatelt;IHistory | nullgt;(null);  useEffect(() =gt; {  backendAPIAxios.get('/history')  .then((response: AxiosResponselt;IHistoryResponsegt;) =gt; {  if (!response.data) {  return alert('Failed to get history');  }   setHistoryState(() =gt; response.data);  })  .catch((e: AxiosError) =gt; {  // alert(`Failed to get history with error: ${e}`);  }); }, [setHistoryState])  console.log(props.history!.reports.map((hist) =gt; lt;pgt;{hist.created_at}lt;/pgt;))  

Это ошибка, которую я получаю:

введите описание изображения здесь

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

1. Вы получаете ошибку, потому props.history что она не определена. Убедитесь, что вы передаете правильные реквизиты этому компоненту.

Ответ №1:

Вы создаете IHistory массив объектов отчетов, когда отчеты-это поле с массивом. Кроме того, created_at, скорее всего, будет строкой, а не датой, если она возвращается из бэкенда.

 type Status = "fair" | "unfair";  interface IHistory {  reports: Arraylt;{  id?: string;  status?: Status;  created_at?: string;  }gt;; };  const backendHistory: IHistory = {  reports: [  { id: "123", status: "fair", created_at: new Date().toISOString() },  { id: "456", status: "unfair", created_at: new Date().toISOString() },  ] };  const result = backendHistory.reports.map(({ id }, _idx) =gt; id); console.log("result", result);  

Код реакции:

 import React from "react";  type Status = "fair" | "unfair";  interface IHistory {  reports: Arraylt;{  id?: string;  status?: Status;  created_at?: string;  }gt;; }  async function fakeFetch(): Promiselt;IHistorygt; {  const backendHistory: IHistory = {  reports: [  { id: "123", status: "fair", created_at: new Date().toISOString() },  { id: "456", status: "unfair", created_at: new Date().toISOString() }  ]  };   return new Promise((resolve) =gt;  setTimeout(() =gt; resolve(backendHistory), 1000)  ); }  export default function App() {  const [backendHistory, setBackendHistory] = React.useStatelt;IHistorygt;();   React.useEffect(() =gt; {  let isAlive = true;   (async function () {  const result = await fakeFetch();  if (isAlive) {  setBackendHistory(result);  }  })();   return () =gt; {  isAlive = false;  };  }, []);   return (  lt;div className="App"gt;  lt;h1gt;Backend Historylt;/h1gt;  {backendHistory ? (  backendHistory.reports.map((hist) =gt; lt;pgt;{hist.id}lt;/pgt;)  ) : (  lt;spangt;loadinglt;/spangt;  )}  lt;/divgt;  ); }  

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

1. Как я могу использовать const backendHistory: IHistory его статику?

2. Это ссылка только для чтения на изменяемый объект. Вы можете использовать его как любую другую переменную. Под этой строкой кода приведен пример использования. backendHistory.reports.map(({ id }, _idx) =gt; id); Я также назвал переменную backendHistory history , потому history что она имеет другое значение в браузере.

3. Я задам лучший вопрос, как я могу использовать его в качестве реквизита? Я получаю данные с сервера

4. Скажите мне, если я ошибаюсь, но я не могу использовать внутреннюю историю для проверки реквизита

5. Выше добавлен пример кода реакции. Если это поможет, можете ли вы проголосовать и принять ответ. Я пытаюсь поднять свои баллы.