Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

Erro na function setTarefas

Olá, pessoal

Estava realizando a montagem do código conforme orientado pelo professor, porém na hora de criar a função setTarefas o seguinte erro é apresentado:

[{ "resource": "/c:/Users/thiag/alura-studies/src/components/Pages/App.tsx", "owner": "typescript", "code": "2345", "severity": 8, "message": "O argumento do tipo '(tarefasAnteriores: Itarefa[]) => { selecionado: boolean; tarefa: string; tempo: string; completado: false; id: string; }[]' não é atribuível ao parâmetro do tipo 'SetStateAction<Itarefa[]>'.\n O tipo '(tarefasAnteriores: Itarefa[]) => { selecionado: boolean; tarefa: string; tempo: string; completado: false; id: string; }[]' não pode ser atribuído ao tipo '(prevState: Itarefa[]) => Itarefa[]'.\n O tipo '{ selecionado: boolean; tarefa: string; tempo: string; completado: false; id: string; }[]' não pode ser atribuído ao tipo 'Itarefa[]'.\n O tipo '{ selecionado: boolean; tarefa: string; tempo: string; completado: false; id: string; }' não pode ser atribuído ao tipo 'Itarefa'.\n Tipos de propriedade 'selecionado' são incompatíveis.\n O tipo 'boolean' não pode ser atribuído ao tipo 'false'.", "source": "ts", "startLineNumber": 14, "startColumn": 16, "endLineNumber": 18, "endColumn": 10 }]

Segue o bloco do código

function App() {
  const [tarefas, setTarefas] = useState<Itarefa[]>([]);
  const [selecionado, setSelecionado] = useState<Itarefa>();

  function selecionaTarefa(tarefaSelecionada: Itarefa) {
    setSelecionado(tarefaSelecionada);
    setTarefas(tarefasAnteriores =>
      tarefasAnteriores.map(tarefa => ({
        ...tarefa,
        selecionado: tarefa.id === tarefaSelecionada.id ? true : false
      })));
  }
  return 

Vale salientar que no navegador a ferramenta de selecionar e alternar as atividades criadas está funcionando perfeitamente, porém não consegui achar uma solução para que este erro sumisse. Poderiam ajudar?

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

7 respostas

Fala Thiago, beleza?

Esta parte do código parece estar certa, consegue mandar a parte em que a função selecionaTarefa é executada?

É provável que ao executar a função do botão "Adicionar", você esteja criando uma nova tarefa com a propriedade

...
selecionado: 'false'
...

sendo o certo,

...
selecionado: false
...

sem as aspas...

Olá, novamente, pessoal. Luiz, segue o bloco inteiro da app.tsx

import React, { useState } from "react";
import { Itarefa } from "../../types/tarefas";
import Cronometro from "../Cronometro";
import Formulario from "../Formulario";
import Lista from "../Lista";
import style from "./App.module.scss";

function App() {
  const [tarefas, setTarefas] = useState<Itarefa[]>([]);
  const [selecionado, setSelecionado] = useState<Itarefa>();

  function selecionaTarefa(tarefaSelecionada: Itarefa) {
    setSelecionado(tarefaSelecionada);
    setTarefas(tarefasAnteriores =>
      tarefasAnteriores.map(tarefa => ({
        ...tarefa,
        selecionado: tarefa.id === tarefaSelecionada.id ? true : false
      })));
      return
  }

  function finalizarTarefa(){
    if (selecionado){
      setSelecionado(undefined)
      setTarefas(tarefasAnteriores => tarefasAnteriores.map(tarefa => {
        if(tarefa.id === selecionado.id) {
          return {
            ...tarefa,
            selecionado: false,
            completado: true
          }
        }
        return tarefa;
      }))
    }

  }
  return (
    <div className={style.AppStyle}>
      <Formulario setTarefas={setTarefas} />
      <Lista 
      tarefas={tarefas} selecionaTarefa={selecionaTarefa} />
      <Cronometro 
      selecionado={selecionado}
      finalizarTarefa={finalizarTarefa}/>
    </div>
  );
}

export default App;

Lucas, verifiquei a função do botão e está sem aspas mesmo

Mostra a função adicionaTarefa que fica no componente de Formulario

Lucas, segue a função

  function adicionarTarefa(evento: React.FormEvent<HTMLFormElement>){
    evento.preventDefault();
    setTarefas(tarefasAntigas => 
      [
        ...tarefasAntigas,
         {
           tarefa,
           tempo,
           selecionado: false,
           completado: false,
           id: uuidv4()
          }
        ]
        );
    setTarefa("");
    setTempo("00:00")


    }
solução!

Thiago,

Eu tive um problema parecido quando estava fazendo essa função. Bati cabeça também, mas no final era algum erro de sintaxe que até hoje não identifiquei!

Algum detalhe na hora de escrever o map estava me dando o mesmo erro. Só consegui resolver escrevendo tudo de novo, sem quebrar as linhas! Aí parou de dar esse erro semelhante, só depois disso eu quebrei novamente as linhas, corrigi a identação e tudo ficou certo. Pra mim é coisa do Typescript implicando com coisa simples...

Olá, Daniel!

Realmente, deve ser algum erro de tipagem do TS ou sintaxe, pois a ferramenta está funcionando perfeitamente, apenas notificando esse erro mesmo. Reescreverei novamente o código para verificar. Obrigado pela dica!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software