gpt4 book ai didi

typescript - 如何在 Typescript 中使用 redux-thunk 使用 ThunkAction 正确键入 thunk?

转载 作者:行者123 更新时间:2023-12-04 15:58:22 25 4
gpt4 key购买 nike

我正在尝试输入检查我的 redux-thunk使用 Typescript 编写代码。
来自 Redux 的官方文档:Usage with Redux Thunk ,我们得到这个例子:

// src/thunks.ts

import { Action } from 'redux'
import { sendMessage } from './store/chat/actions'
import { RootState } from './store'
import { ThunkAction } from 'redux-thunk'

export const thunkSendMessage = (
message: string
): ThunkAction<void, RootState, unknown, Action<string>> => async dispatch => {
const asyncResp = await exampleAPI()
dispatch(
sendMessage({
message,
user: asyncResp,
timestamp: new Date().getTime()
})
)
}

function exampleAPI() {
return Promise.resolve('Async Chat Bot')
}
为了减少重复,您可能希望在您的商店文件中定义一次可重用的 AppThunk 类型,然后在编写 thunk 时使用该类型:
export type AppThunk<ReturnType = void> = ThunkAction<
ReturnType,
RootState,
unknown,
Action<string>
>
问题
我不完全理解 ThunkAction 的用法类型:
ThunkAction<void, RootState, unknown, Action<string>>
有 4 个类型参数,对吧?
第一 - void这是 thunk 的返回类型,对吧?不应该是 Promise<void> , 因为它是 async ?
第二 - RootState这是完整的状态形状,对吧?我的意思是,它不是切片,而是完整的状态。
第三 - unknown这是为什么 unknown ?这是什么?
第四 - Action<string>这个也不懂。为什么是 Action<T>将字符串作为参数?应该总是 string ?为什么?

最佳答案

来自 https://github.com/reduxjs/redux-thunk/blob/d28ab03fd1d2dd1de402928a9589857e97142e09/src/index.d.ts 的打字

/**
* A "thunk" action (a callback function that can be dispatched to the Redux
* store.)
*
* Also known as the "thunk inner function", when used with the typical pattern
* of an action creator function that returns a thunk action.
*
* @template TReturnType The return type of the thunk's inner function
* @template TState The redux state
* @template TExtraThunkARg Optional extra argument passed to the inner function
* (if specified when setting up the Thunk middleware)
* @template TBasicAction The (non-thunk) actions that can be dispatched.
*/
export type ThunkAction<
TReturnType,
TState,
TExtraThunkArg,
TBasicAction extends Action
> = (
dispatch: ThunkDispatch<TState, TExtraThunkArg, TBasicAction>,
getState: () => TState,
extraArgument: TExtraThunkArg,
) => TReturnType;
第一 - TReturnType
在这里,我们不关心返回类型——无论如何我们都不会等待 thunk 的结果。在 TS 中,可以将任何函数分配给 void 签名,因为它不会损害类型安全。 Here's一个示例显示我可以将各种异步/非异步函数分配给 void 函数签名:
playground void assignment screenshot
我们使用提供的 dispatch 函数来触发我们关心的下一个 Action ——所以在时间方面唯一重要的事情是在异步函数内部我们正在等待某些事情。 Redux-thunk 内部没有对这个函数的结果做任何事情。这是一个很好的解释器,解释了 thunks 如何在引擎盖下工作(只需要预览):
https://frontendmasters.com/courses/rethinking-async-js/synchronous-and-asynchronous-thunks/
第二 - TState
是的 - 这是整个商店状态类型
第三个 - TExtraThunkARg
您可以添加自己的自定义额外参数,该参数在 dispatch 和 getState 后传递到 thunk。这默认为未知,因为除非您明确提供它,否则不清楚它将是什么。这是类型安全的,因为尝试与未知参数交互将导致编译时错误。
更多信息: https://github.com/reduxjs/redux-thunk#injecting-a-custom-argument
第四 - TBasicAction
这是一种 Action 类型。 Action 是最基本的 Action 类型——其中每 type属性是一个普通字符串。您可以选择提供自己的更具体的类型 - 即 type MyActionType = 'FOO_ACTION' | 'BAR_ACTION'进一步类型安全/缩小。然后您将使用它作为操作。

关于typescript - 如何在 Typescript 中使用 redux-thunk 使用 ThunkAction 正确键入 thunk?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63881398/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com