簡體   English   中英

如何為對象上的數組定義 typescript 接口

[英]How to define typescript interface for array on objects

圖片

這是來自服務器的數據。

我想在 UI 上用 map 顯示它。

這是我做的界面 -

export interface IHistory {
    reports: Readonly<{
        readonly id?: string,
        status?: Status,
        readonly created_at?: Date,
    }>
}[];

我正在做的 map - {props.history.,map((index, idx) => {}

錯誤 -

TypeError: Cannot read properties of null (reading 'map')

我究竟做錯了什么? 我只想顯示報告

在此處輸入圖像描述

添加 -

界面 -

    export interface IHistory {
      reports: Array<{
        id?: string;
        status?: Status;
        created_at?: string;
      }>;
    };

 const [ hitoryState, setHistoryState ] = useState<IHistory | null>(null);

    useEffect(() => {
      backendAPIAxios.get('/history')
      .then((response: AxiosResponse<IHistoryResponse>) => {
        if (!response.data) {
          return alert('Failed to get history');
        }

        setHistoryState(() => response.data);
      })
      .catch((e: AxiosError) => {
        // alert(`Failed to get history with error: ${e}`);
      });
    }, [setHistoryState])

  console.log(props.history!.reports.map((hist) => <p>{hist.created_at}</p>))

這是我得到的錯誤 -

在此處輸入圖像描述

當報表是具有數組的字段時,您正在使 IHistory 成為報表對象的數組。 此外,如果從后端返回 created_at 可能是字符串而不是日期。

type Status = "fair" | "unfair";

interface IHistory {
  reports: Array<{
    id?: string;
    status?: Status;
    created_at?: string;
  }>;
};

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) => id);
console.log("result", result);

反應代碼:

import React from "react";

type Status = "fair" | "unfair";

interface IHistory {
  reports: Array<{
    id?: string;
    status?: Status;
    created_at?: string;
  }>;
}

async function fakeFetch(): Promise<IHistory> {
  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) =>
    setTimeout(() => resolve(backendHistory), 1000)
  );
}

export default function App() {
  const [backendHistory, setBackendHistory] = React.useState<IHistory>();

  React.useEffect(() => {
    let isAlive = true;

    (async function () {
      const result = await fakeFetch();
      if (isAlive) {
        setBackendHistory(result);
      }
    })();

    return () => {
      isAlive = false;
    };
  }, []);

  return (
    <div className="App">
      <h1>Backend History</h1>
      {backendHistory ? (
        backendHistory.reports.map((hist) => <p>{hist.id}</p>)
      ) : (
        <span>loading</span>
      )}
    </div>
  );
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM