-
Notifications
You must be signed in to change notification settings - Fork 4.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Promisify action creator return type for WP data dispatch #52530
Merged
Merged
Changes from all commits
Commits
Show all changes
11 commits
Select commit
Hold shift + click to select a range
5162962
Promisify action creators in ActionCreatorsOf type
noahtallen 943ff9c
Add singular and plural helper types
noahtallen 3046bf7
Add returntype for promisified action creators
noahtallen a9aad26
Add changelog entry
noahtallen 9566b70
Update plain dispatch to handle string store descriptor
noahtallen 006048e
Update PromisifiedActionCreator to handle thunks
noahtallen e08fd01
Update generated docs
noahtallen de0aeae
Clarify comments
noahtallen 1b9b7ad
Account for async thunks
noahtallen cc4ca6a
Update changelog
noahtallen 8cbdc88
Make comment less redundant
noahtallen File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -6,7 +6,7 @@ import type { combineReducers as reduxCombineReducers } from 'redux'; | |
|
||
type MapOf< T > = { [ name: string ]: T }; | ||
|
||
export type ActionCreator = Function | Generator; | ||
export type ActionCreator = ( ...args: any[] ) => any | Generator; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
export type Resolver = Function | Generator; | ||
export type Selector = Function; | ||
|
||
|
@@ -43,13 +43,15 @@ export interface ReduxStoreConfig< | |
controls?: MapOf< Function >; | ||
} | ||
|
||
// Return type for the useSelect() hook. | ||
export type UseSelectReturn< F extends MapSelect | StoreDescriptor< any > > = | ||
F extends MapSelect | ||
? ReturnType< F > | ||
: F extends StoreDescriptor< any > | ||
? CurriedSelectorsOf< F > | ||
: never; | ||
|
||
// Return type for the useDispatch() hook. | ||
export type UseDispatchReturn< StoreNameOrDescriptor > = | ||
StoreNameOrDescriptor extends StoreDescriptor< any > | ||
? ActionCreatorsOf< ConfigOf< StoreNameOrDescriptor > > | ||
|
@@ -59,9 +61,12 @@ export type UseDispatchReturn< StoreNameOrDescriptor > = | |
|
||
export type DispatchFunction = < StoreNameOrDescriptor >( | ||
store: StoreNameOrDescriptor | ||
) => StoreNameOrDescriptor extends StoreDescriptor< any > | ||
? ActionCreatorsOf< ConfigOf< StoreNameOrDescriptor > > | ||
: any; | ||
) => DispatchReturn< StoreNameOrDescriptor >; | ||
|
||
export type DispatchReturn< StoreNameOrDescriptor > = | ||
StoreNameOrDescriptor extends StoreDescriptor< any > | ||
? ActionCreatorsOf< ConfigOf< StoreNameOrDescriptor > > | ||
: unknown; | ||
|
||
export type MapSelect = ( | ||
select: SelectFunction, | ||
|
@@ -170,9 +175,37 @@ export type ConfigOf< S > = S extends StoreDescriptor< infer C > ? C : never; | |
|
||
export type ActionCreatorsOf< Config extends AnyConfig > = | ||
Config extends ReduxStoreConfig< any, infer ActionCreators, any > | ||
? ActionCreators | ||
? PromisifiedActionCreators< ActionCreators > | ||
: never; | ||
|
||
// Takes an object containing all action creators for a store and updates the | ||
// return type of each action creator to account for internal registry details -- | ||
// for example, dispatched actions are wrapped with a Promise. | ||
export type PromisifiedActionCreators< | ||
ActionCreators extends MapOf< ActionCreator > | ||
> = { | ||
[ Action in keyof ActionCreators ]: PromisifyActionCreator< | ||
ActionCreators[ Action ] | ||
>; | ||
}; | ||
|
||
// Wraps action creator return types with a Promise and handles thunks. | ||
export type PromisifyActionCreator< Action extends ActionCreator > = ( | ||
...args: Parameters< Action > | ||
) => Promise< | ||
ReturnType< Action > extends ( ..._args: any[] ) => any | ||
? ThunkReturnType< Action > | ||
: ReturnType< Action > | ||
>; | ||
|
||
// A thunk is an action creator which returns a function, which can optionally | ||
// return a Promise. The double ReturnType unwraps the innermost function's | ||
// return type, and Awaited gets the type the Promise resolves to. If the return | ||
// type is not a Promise, Awaited returns that original type. | ||
export type ThunkReturnType< Action extends ActionCreator > = Awaited< | ||
ReturnType< ReturnType< Action > > | ||
>; | ||
|
||
type SelectorsOf< Config extends AnyConfig > = Config extends ReduxStoreConfig< | ||
any, | ||
any, | ||
|
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
While testing in another repo, I came across an error where
dispatch( 'store-name' )
had the return typeActionCreatorsOf...
. This return type doesn't work, because we aren't using the object format of the store name.useDispatch
handles this correctly (the return type should be unknown or similar, since we don't know any metadata about the store), so this basically makes it more similar to those types.