我正在编写一个钩子来进行发出POST请求,并返回sessionId
和sessionData
这两个属性。我将在组件中使用此钩子,它看起来像这样:
export const createOrder = async () => {
try {
const response = await postWithToken(API_ROUTES.PAYMENT_SESSION, token || '',
testObject)
console.log("FROM HOOK", response)
return response
} catch (err: any) {
console.log(err)
}
}
我的组件长这样:
const myComponent = () => {
useEffect(() => {
createOrder().then(data => {
console.log("Session Data",data.sessionData)
console.log("FROM PAGE", data)
})
}, [])
return (
<div />
)
}
当我尝试在组件中访问data.sessionData时,我会收到一个错误,该错误表明sessionData不存在于void类型上。但是,如果我检查控制台上的日志,则在组件和钩子上都会得到相同的对象。此外,如果我检查数据的类型,我会得到一个对象。
为什么会出现这个错误?
catch
块中没有返回任何内容,因此你的函数的返回类型是WhateverTheTypeOfResponseIs | void
,具体取决于哪个代码路径执行。你在使用JavaScript还是TypeScript?你从哪里得到了这个错误信息?是来自VSCode的智能提示吗? - Jared SmithPromise<void>
是TypeScript编译器推断的默认类型。当我尝试为异步函数的返回类型进行类型标注时,会出现“TypeWhateverTheTypeOfResponseIs
is not a validasync
function return type in ES5/ES3 because it does not refer to a Promise-compatible constructor value”的错误提示。由于我从组件中调用钩子函数createOrder
,所以我也没有落入catch块中。实际上,如果我检查组件的类型,我也会得到一个对象。 - l.legrenuseEffect
钩子内,在调用.catch
时处理错误,例如createOrder().then(...).catch(...)
。然后简化你的createOrder
函数,只需简单地返回postWithToken(...)
。另外,createOrder
不是一个钩子(hook)-它只是一个简单的函数。 - gotoTypeScript
,但没有提供createOrder
的返回类型,例如createOrder = async (): Promise<SomeType>
,这就是为什么出现了错误提示。 - goto