как установить реагировать машинопись использовать тип извлечения и использовать метод карты - PullRequest
0 голосов
/ 11 апреля 2020

в настоящее время я практикую реагирование на получение json данных через asyn c fetcher

Пример кода ниже, как этот

//Test.tsx
import React, { useState, useEffect } from 'react';
import fetcher from 'api/fetcher';

interface Todo {
  userId: number;
  id: number;
  title: string;
  completed: boolean;
}

const Test: React.FC = () => {
  const [data, setData] = useState<Todo[]| Promise<Todo[]>>([{
    userId: 1,
    id: 1234,
    title: "test",
    completed: false
  }]);

  useEffect(() => {
    const result = fetcher("https://jsonplaceholder.typicode.com/todos");
    setData(result);
    console.log(result);
  }, [])
  return (
    <div>
      //error in here
      **{data && data.map()}**
        {/* {data && data.map((item: Todo)=> {
          <div>{item.id}<div>
        })} */}
  </div>
  );
}
export default Test;
//fetcher.ts
async function fetcher(url: RequestInfo) {
  try {
    const res = await fetch(url);
    const json = await res.json();
    console.log("json: ", json);
    return json;
  } catch (e) {
    throw e;
  }
}

export default fetcher;

Ошибка Сообщение: Свойство 'map' не существует для типа 'Todo [] | Promise». Свойство 'map' не существует для типа 'Promise'

Я знаю, что метод карты нельзя использовать в объекте Promise. из-за асинхронного вызова c исходный тип данных устанавливается на тип Promise и переключается на Todo [], когда выборка разрешена.

как решить эту проблему, чтобы динамически использовать метод map

1 Ответ

1 голос
/ 11 апреля 2020

Вы не должны устанавливать обещание, чтобы установить вместо того, чтобы установить результат, полученный после того, как обещание разрешено. Чтобы дождаться выполнения обещания, вы можете использовать метод async-await или conventional .then. Также удалите Promise как тип из значения useState

const Test: React.FC = () => {
  const [data, setData] = useState<Todo[]>([{
    userId: 1,
    id: 1234,
    title: "test",
    completed: false
  }]);

  useEffect(() => {
    fetcher("https://jsonplaceholder.typicode.com/todos").then((result) => {
        setData(result);
    });
  }, [])
  return (
    <div>
        {data && data.map((item: Todo)=> {
          <div>{item.id}<div>
        })}
  </div>
  );
}
export default Test;
...