我在新的react-router-dom
中使用加载器,当我在组件中使用useLoaderData
钩子时,响应类型是未知的,所以我不能使用它。我不想使用as
类型定义,因为我觉得这是一种欺骗,但如果这是唯一的方法,那么,请让我知道:
我的加载器功能:
{
path: "/reset-password/:resetToken",
element: <ResetPassword />,
loader: async ({ params }) => {
if (!params.resetToken){
return null
}
const fakeTokens = ["abcdef123456", "bingbong", "foobar"]
// make API call to check if the given token is valid
const fakeAPICall = (resetToken: string) : Promise<object> => {
if (fakeTokens.includes(resetToken)){
return new Promise(resolve => resolve({ success: true }))
}
return new Promise(resolve => resolve({ success: false }))
}
const resp = await fakeAPICall(params.resetToken);
return resp;
}
},
在<ResetPassword />
内部:
// this type is "unknown", so I can't access the properties on it
const resetTokenResponse = useLoaderData()
2条答案
按热度按时间w41d8nur1#
useLoaderData
钩子的返回类型***是***unknown
,因此您需要在组件中重新键入它。参见来源
使用
as
类型的AFAIK就是您要做的,即...
rkue9o1l2#
我个人更喜欢将原来的
useLoaderData
封装在另一个函数中(至少在它不支持泛型时):这个新函数使用您编写的加载器函数来解析其返回类型。
然后,我们可以使用
useDataFromLoader
(或者你叫它什么),而不是使用原来的useLoaderData
,并将你的加载器fn传递给它(这样它就可以计算出它的返回类型):而且我还喜欢说我的加载器
satisfies
是原来的/预期的LoaderFunction
,这样我们就可以访问params
和request
(例如),并避免在路由器中使用它时出现任何类型不匹配的情况。