我一直在沿着Redux Essentials Tutorials学习如何使用createAsyncThunk
来生成Thunk。在他们的例子中,他们创建了一个thunk,如下所示:
export const addNewPost = createAsyncThunk(
'posts/addNewPost',
async (initialPost) => { // Note: initialPost is an object with 3 props: title, content, user
const response = await client.post('/fakeApi/posts', initialPost)
return response.data
}
)
字符串
他们在另一个文件中这样调用它:
await dispatch(addNewPost({ title, content, user: userId }))
型
在我的项目中,我安装了typescript和react类型(@types/react
)。即使代码是JavaScript,这也让我从VSCode IDE中获得了正确的类型。然而,当我这样做时,我看到:
的数据
类型化需要0个参数,但得到了一个,我的对象。将鼠标悬停在方法addNewPost
上,我看到它没有接受参数,并返回了一个blog操作。
的
我怎样才能让我的IDE和typescript打字支持识别所需的正确参数?
我努力
尝试向创建的addNewPost
函数添加一些JSDOC字符串,如下所示:
/**
* addNewPost
* @returns {(initialPost:{title:string, content:string, user: string}) => void} the returned action create takes an object as arg
*/
export const addNewPost = createAsyncThunk(
'posts/addNewPost',
async (initialPost) => {
const response = await client.post('/fakeApi/posts', initialPost)
...
型
下面是另一个Stack Overflow suggestion关于如何使用JSign来描述返回的函数。但这似乎不起作用。
有人有什么建议吗?
3条答案
按热度按时间nkhmeac61#
问题是Redux的默认
Dispatch
类型只知道dispatch()
函数可以接受普通操作对象。它不知道形实转换函数是可以传入的有效对象。为了使这段代码正确工作,你需要按照我们的说明来设置存储,并根据配置的所有实际中间件来推断
dispatch
的 * 真实的 * 类型,其中通常包括形实转换中间件:https://redux.js.org/tutorials/typescript-quick-start
然后,在应用程序的其他地方使用
AppDispatch
类型,这样当你尝试调度一些东西时,TS会识别出thunk是一个可以传入的有效东西。所以,通常情况下:
字符串
此外,在您的特定情况下,您使用的是
createAsyncThunk
。您需要告诉TS其参数的类型,请参阅https://redux-toolkit.js.org/usage/usage-with-typescript#createasyncthunk:型
hivapdat2#
我很幸运地修改了JSDoc,使其在
createAsyncThunk
函数中的payloadCreator
参数之上,如下所示:字符串
当我更仔细地观察
createAsyncThunk
的工作方式时,我意识到为什么这更有意义,因为AsyncThunk本身并不返回这些值,它们是我们传递给它的函数的参数和返回类型。6g8kf2rb3#
在VSCode上,我设法让所有内容都正确显示的唯一方法是使用智能感知(描述和参数名称),方法如下:
字符串
的数据
的
相比之下,这是我将JSDoc放在
payloadCreator
上面时得到的结果:型