打字稿:类型 'Promise<void>' 不可分配给类型 'void | Destructor'

Typescript: Type 'Promise<void>' is not assignable to type 'void | Destructor'

编辑正在展示

Type 'Promise' is not assignable to type 'void | Destructor'.

用于 useEffect 中的 checkUserLoggedIn() 调用。

我可以通过执行 const checkUserLoggedIn:any

来摆脱它

然而,也许这不是解决这个问题的最理想方法...

如果我做 const checkUserLoggedIn:Promise 然后我得到一个不同的错误:

This expression is not callable. Type 'Promise' has no call signatures.

这不是我想要的...我希望它是可调用的...我正在 translating/converting 我的 javascript 文件到 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)
        }
    }

以您隐式描述的方式编写的箭头函数 return 函数的值。例如,此函数 () => 4 return 的值 4。相反,当您将其包装在一个块中时,您必须显式定义 return 值:() => { 4; } 此函数不 return 任何东西。

在你的例子中,你正在传递一个匿名箭头函数,它隐含地 return 是一个异步函数的结果,这是一个承诺。

要解决此问题,请将传递给 useEffect 的函数的内容包装在一个块中:

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

    // Check if user is logged in
    const checkUserLoggedIn:() => Promise<void> = 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)
        }
    }