Add typings for all @wordpress/data store selection variants
Both store name and store descriptor typings should work in all cases. [MAILPOET-5102]
This commit is contained in:
@@ -3,10 +3,9 @@ import { ColorPalette, FontSizePicker } from '@wordpress/components';
|
|||||||
import { ConfirmDialog } from '@wordpress/components/build-types/confirm-dialog';
|
import { ConfirmDialog } from '@wordpress/components/build-types/confirm-dialog';
|
||||||
import {
|
import {
|
||||||
ActionCreatorsOf,
|
ActionCreatorsOf,
|
||||||
AnyConfig,
|
|
||||||
ConfigOf,
|
ConfigOf,
|
||||||
CurriedSelectorsOf,
|
CurriedSelectorsOf,
|
||||||
MapSelect,
|
DataRegistry,
|
||||||
StoreDescriptor as GenericStoreDescriptor,
|
StoreDescriptor as GenericStoreDescriptor,
|
||||||
UseSelectReturn,
|
UseSelectReturn,
|
||||||
} from '@wordpress/data/build-types/types';
|
} from '@wordpress/data/build-types/types';
|
||||||
@@ -75,25 +74,64 @@ declare module '@wordpress/components' {
|
|||||||
|
|
||||||
// fix and improve some @wordpress/data types
|
// fix and improve some @wordpress/data types
|
||||||
declare module '@wordpress/data' {
|
declare module '@wordpress/data' {
|
||||||
export function select<T extends GenericStoreDescriptor<AnyConfig>>(
|
// Derive typings for select(), dispatch(), useSelect(), and useDispatch()calls
|
||||||
|
// by store name. The StoreMap interface can be augmented to add custom stores.
|
||||||
|
interface StoreMap {
|
||||||
|
[key: string]: StoreDescriptor;
|
||||||
|
}
|
||||||
|
|
||||||
|
type TKey = keyof StoreMap;
|
||||||
|
type TStore<T> = T extends keyof StoreMap ? StoreMap[T] : never;
|
||||||
|
type TSelectors<T> = CurriedSelectorsOf<TStore<T>>;
|
||||||
|
type TActions<T> = ActionCreatorsOf<ConfigOf<TStore<T>>>;
|
||||||
|
type TSelectFunction = <T extends TKey | StoreDescriptor>(
|
||||||
|
store: T,
|
||||||
|
) => T extends TKey ? TSelectors<T> : CurriedSelectorsOf<T>;
|
||||||
|
type TMapSelect = (select: TSelectFunction, registry: DataRegistry) => any;
|
||||||
|
|
||||||
|
// select('store-name')
|
||||||
|
function select<T extends string>(store: T): TSelectors<T>;
|
||||||
|
|
||||||
|
// fix return type for select(storeDescriptor)
|
||||||
|
export function select<T extends GenericStoreDescriptor<any>>(
|
||||||
store: T,
|
store: T,
|
||||||
): CurriedSelectorsOf<T>;
|
): CurriedSelectorsOf<T>;
|
||||||
|
|
||||||
|
// dispatch('store-name')
|
||||||
|
function dispatch<T extends string>(store: T): TActions<T>;
|
||||||
|
|
||||||
|
// fix return type for dispatch(storeDescriptor)
|
||||||
export function dispatch<T extends GenericStoreDescriptor<any>>(
|
export function dispatch<T extends GenericStoreDescriptor<any>>(
|
||||||
store: T,
|
store: T,
|
||||||
): ActionCreatorsOf<ConfigOf<T>>;
|
): ActionCreatorsOf<ConfigOf<T>>;
|
||||||
|
|
||||||
// in @wordpress/data, the "deps" is not optional (while in reality it is)
|
|
||||||
export function useSelect<T extends MapSelect | GenericStoreDescriptor<any>>(
|
|
||||||
mapSelect: T,
|
|
||||||
deps?: unknown[],
|
|
||||||
): UseSelectReturn<T>;
|
|
||||||
|
|
||||||
// function "batch" is missing in data registry
|
// function "batch" is missing in data registry
|
||||||
export function useRegistry(): {
|
export function useRegistry(): {
|
||||||
batch: (callback: () => void) => void;
|
batch: (callback: () => void) => void;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// useSelect((select) => select('store-name') => ...)
|
||||||
|
// useSelect((select) => select(storeDescriptor) => ...)
|
||||||
|
export function useSelect<T extends TMapSelect>(
|
||||||
|
mapSelect: T,
|
||||||
|
deps?: unknown[],
|
||||||
|
): ReturnType<T>;
|
||||||
|
|
||||||
|
// useSelect(storeDescriptor)
|
||||||
|
export function useSelect<T extends StoreDescriptor>(
|
||||||
|
store: T,
|
||||||
|
deps?: unknown[],
|
||||||
|
): UseSelectReturn<T>;
|
||||||
|
|
||||||
|
// useSelect('store-name')
|
||||||
|
export function useSelect<T extends string>(
|
||||||
|
store: T,
|
||||||
|
deps?: unknown[],
|
||||||
|
): UseSelectReturn<TStore<T>>;
|
||||||
|
|
||||||
|
// useDispatch('store-name')
|
||||||
|
export function useDispatch<T extends string>(store: T): TActions<T>;
|
||||||
|
|
||||||
// types for "createRegistrySelector" are not correct
|
// types for "createRegistrySelector" are not correct
|
||||||
export function createRegistrySelector<
|
export function createRegistrySelector<
|
||||||
S extends typeof select,
|
S extends typeof select,
|
||||||
|
Reference in New Issue
Block a user