Pesquisa de site

javascript - Typescript: Tipo 'Promise' não é atribuível ao tipo 'void | Destructor'


O editor está mostrando

O tipo 'Promise' não pode ser atribuído ao tipo 'void | Destructor'.

para a chamada checkUserLoggedIn() no useEffect.

Posso me livrar disso fazendo const checkUserLoggedIn:any

No entanto, talvez essa não seja a maneira mais ideal de resolver isso...

Se eu fizer const checkUserLoggedIn:Promise, então recebo um erro diferente:

Esta expressão não é chamável. O tipo 'Promise' não possui assinaturas de chamada.

o que não é o que eu quero... Eu quero que seja chamável... Estou traduzindo/convertendo meu arquivo JavaScript para TypeScript.....

useEffect(() => checkUserLoggedIn(), [])

    // Check if user is logged in
    const checkUserLoggedIn = async () => {
        console.log('checkUserLoggedIn')

        const res = await fetch(`${NEXT_URL}/api/user`)
        const data = await res.json()

        if (res.ok) {
            setUser(data.user)

            console.log('data.user', data.user)
            router.push('/account/dashboard')
        } else {
            setUser(null)
        }
    }

Resposta #1

Funções arrow escritas da maneira que você descreveu retornam implicitamente o valor da função. Por exemplo, esta função () => 4 retorna o valor 4. Por outro lado, quando você a envolve em um bloco, deve definir explicitamente o valor de retorno: () => { 4; } esta função não retorna nada.

No seu caso, você está passando uma função arrow anônima que retorna implicitamente o resultado de uma função assíncrona, que é uma promessa.

Para corrigir isso, envolva o conteúdo da função que você passa para useEffect em um bloco:

useEffect(() => {
  checkUserLoggedIn();
}, []);

Artigos relacionados