Pesquisa de site

reactjs - Argumento do tipo 'Response' não é atribuível ao parâmetro do tipo 'SetStateAction'


Esta é a minha interface CommentResponse, que é a estrutura de um objeto dentro do array da resposta da API

interface CommentResponse {
  body: string;
  email: string;
  id: number;
  name: string;
  postId: number;
}

Ao definir os dados da resposta da API usando setAllComments (hook useState), estou recebendo o seguinte erro

/typescript-demo/src/components/Dashboard/index.tsx
TypeScript error in /typescript-demo/src/components/Dashboard/index.tsx(35,20):
Argument of type 'Response' is not assignable to parameter of type 'SetStateAction<CommentResponse[]>'.
  Type 'Response' is missing the following properties from type 'CommentResponse[]': length, pop, push, concat, and 28 more.  TS2345
    32 |     comments = await comments.json();
    33 |     console.log(comments);
    34 |     // comments = await JSON.parse(comments);
  > 35 |     setAllComments(comments);
       |                    ^
    36 |   };
    37 | 
    38 |   useEffect(() => {

@RajaJaganathan

const [allComments, setAllComments] = useState<CommentResponse[]>([]);

  const commentService = async () => {
    const COMMENTS_API = `https://jsonplaceholder.typicode.com/comments`;    
    let comments = await fetch<Array<CommentResponse>>(COMMENTS_API);

    comments = await comments.json();
    console.log(comments);

    setAllComments(comments);
  };

Eu visitei outros links do StackOverflow e do Google, mas não consegui obter a solução

Resposta #1

Parece que comments é um objeto Response. Para extrair o valor dele, você precisará chamar .json() nele.

Parece que o genérico de .json foi removido, então você terá que usar uma asserção de tipo:

fetch('some-api')
  .then(res => res.json())
  .then(comments => setAllComments(comments as Array<CommentResponse>))
  .catch(handleErrors);

Resposta #2

No seu caso, a resposta do fetch está retornando um objeto do tipo Object que possui valores como Response {type: "cors", url: "https://jsonplaceholder.typicode.com/comments", redirected: false, status: 200…}

coloque sua interface no lugar certo :

const COMMENTS_API = `https://jsonplaceholder.typicode.com/comments`;    
let comments =  await fetch(COMMENTS_API);

let result: Array<CommentResponse> = await comments.json();

setAllComments(result);

você pode usar ambos os tipos result:Array<CommentResponse> ou result:CommentResponse[].

verifique a demonstração do código aqui para fetch e axios.