createAction.d.ts 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. import type { Action } from 'redux';
  2. import type { IsUnknownOrNonInferrable, IfMaybeUndefined, IfVoid, IsAny } from './tsHelpers';
  3. /**
  4. * An action with a string type and an associated payload. This is the
  5. * type of action returned by `createAction()` action creators.
  6. *
  7. * @template P The type of the action's payload.
  8. * @template T the type used for the action type.
  9. * @template M The type of the action's meta (optional)
  10. * @template E The type of the action's error (optional)
  11. *
  12. * @public
  13. */
  14. export declare type PayloadAction<P = void, T extends string = string, M = never, E = never> = {
  15. payload: P;
  16. type: T;
  17. } & ([M] extends [never] ? {} : {
  18. meta: M;
  19. }) & ([E] extends [never] ? {} : {
  20. error: E;
  21. });
  22. /**
  23. * A "prepare" method to be used as the second parameter of `createAction`.
  24. * Takes any number of arguments and returns a Flux Standard Action without
  25. * type (will be added later) that *must* contain a payload (might be undefined).
  26. *
  27. * @public
  28. */
  29. export declare type PrepareAction<P> = ((...args: any[]) => {
  30. payload: P;
  31. }) | ((...args: any[]) => {
  32. payload: P;
  33. meta: any;
  34. }) | ((...args: any[]) => {
  35. payload: P;
  36. error: any;
  37. }) | ((...args: any[]) => {
  38. payload: P;
  39. meta: any;
  40. error: any;
  41. });
  42. /**
  43. * Internal version of `ActionCreatorWithPreparedPayload`. Not to be used externally.
  44. *
  45. * @internal
  46. */
  47. export declare type _ActionCreatorWithPreparedPayload<PA extends PrepareAction<any> | void, T extends string = string> = PA extends PrepareAction<infer P> ? ActionCreatorWithPreparedPayload<Parameters<PA>, P, T, ReturnType<PA> extends {
  48. error: infer E;
  49. } ? E : never, ReturnType<PA> extends {
  50. meta: infer M;
  51. } ? M : never> : void;
  52. /**
  53. * Basic type for all action creators.
  54. *
  55. * @inheritdoc {redux#ActionCreator}
  56. */
  57. export interface BaseActionCreator<P, T extends string, M = never, E = never> {
  58. type: T;
  59. match: (action: Action<unknown>) => action is PayloadAction<P, T, M, E>;
  60. }
  61. /**
  62. * An action creator that takes multiple arguments that are passed
  63. * to a `PrepareAction` method to create the final Action.
  64. * @typeParam Args arguments for the action creator function
  65. * @typeParam P `payload` type
  66. * @typeParam T `type` name
  67. * @typeParam E optional `error` type
  68. * @typeParam M optional `meta` type
  69. *
  70. * @inheritdoc {redux#ActionCreator}
  71. *
  72. * @public
  73. */
  74. export interface ActionCreatorWithPreparedPayload<Args extends unknown[], P, T extends string = string, E = never, M = never> extends BaseActionCreator<P, T, M, E> {
  75. /**
  76. * Calling this {@link redux#ActionCreator} with `Args` will return
  77. * an Action with a payload of type `P` and (depending on the `PrepareAction`
  78. * method used) a `meta`- and `error` property of types `M` and `E` respectively.
  79. */
  80. (...args: Args): PayloadAction<P, T, M, E>;
  81. }
  82. /**
  83. * An action creator of type `T` that takes an optional payload of type `P`.
  84. *
  85. * @inheritdoc {redux#ActionCreator}
  86. *
  87. * @public
  88. */
  89. export interface ActionCreatorWithOptionalPayload<P, T extends string = string> extends BaseActionCreator<P, T> {
  90. /**
  91. * Calling this {@link redux#ActionCreator} with an argument will
  92. * return a {@link PayloadAction} of type `T` with a payload of `P`.
  93. * Calling it without an argument will return a PayloadAction with a payload of `undefined`.
  94. */
  95. (payload?: P): PayloadAction<P, T>;
  96. }
  97. /**
  98. * An action creator of type `T` that takes no payload.
  99. *
  100. * @inheritdoc {redux#ActionCreator}
  101. *
  102. * @public
  103. */
  104. export interface ActionCreatorWithoutPayload<T extends string = string> extends BaseActionCreator<undefined, T> {
  105. /**
  106. * Calling this {@link redux#ActionCreator} will
  107. * return a {@link PayloadAction} of type `T` with a payload of `undefined`
  108. */
  109. (noArgument: void): PayloadAction<undefined, T>;
  110. }
  111. /**
  112. * An action creator of type `T` that requires a payload of type P.
  113. *
  114. * @inheritdoc {redux#ActionCreator}
  115. *
  116. * @public
  117. */
  118. export interface ActionCreatorWithPayload<P, T extends string = string> extends BaseActionCreator<P, T> {
  119. /**
  120. * Calling this {@link redux#ActionCreator} with an argument will
  121. * return a {@link PayloadAction} of type `T` with a payload of `P`
  122. */
  123. (payload: P): PayloadAction<P, T>;
  124. }
  125. /**
  126. * An action creator of type `T` whose `payload` type could not be inferred. Accepts everything as `payload`.
  127. *
  128. * @inheritdoc {redux#ActionCreator}
  129. *
  130. * @public
  131. */
  132. export interface ActionCreatorWithNonInferrablePayload<T extends string = string> extends BaseActionCreator<unknown, T> {
  133. /**
  134. * Calling this {@link redux#ActionCreator} with an argument will
  135. * return a {@link PayloadAction} of type `T` with a payload
  136. * of exactly the type of the argument.
  137. */
  138. <PT extends unknown>(payload: PT): PayloadAction<PT, T>;
  139. }
  140. /**
  141. * An action creator that produces actions with a `payload` attribute.
  142. *
  143. * @typeParam P the `payload` type
  144. * @typeParam T the `type` of the resulting action
  145. * @typeParam PA if the resulting action is preprocessed by a `prepare` method, the signature of said method.
  146. *
  147. * @public
  148. */
  149. export declare type PayloadActionCreator<P = void, T extends string = string, PA extends PrepareAction<P> | void = void> = IfPrepareActionMethodProvided<PA, _ActionCreatorWithPreparedPayload<PA, T>, IsAny<P, ActionCreatorWithPayload<any, T>, IsUnknownOrNonInferrable<P, ActionCreatorWithNonInferrablePayload<T>, IfVoid<P, ActionCreatorWithoutPayload<T>, IfMaybeUndefined<P, ActionCreatorWithOptionalPayload<P, T>, ActionCreatorWithPayload<P, T>>>>>>;
  150. /**
  151. * A utility function to create an action creator for the given action type
  152. * string. The action creator accepts a single argument, which will be included
  153. * in the action object as a field called payload. The action creator function
  154. * will also have its toString() overridden so that it returns the action type,
  155. * allowing it to be used in reducer logic that is looking for that action type.
  156. *
  157. * @param type The action type to use for created actions.
  158. * @param prepare (optional) a method that takes any number of arguments and returns { payload } or { payload, meta }.
  159. * If this is given, the resulting action creator will pass its arguments to this method to calculate payload & meta.
  160. *
  161. * @public
  162. */
  163. export declare function createAction<P = void, T extends string = string>(type: T): PayloadActionCreator<P, T>;
  164. /**
  165. * A utility function to create an action creator for the given action type
  166. * string. The action creator accepts a single argument, which will be included
  167. * in the action object as a field called payload. The action creator function
  168. * will also have its toString() overridden so that it returns the action type,
  169. * allowing it to be used in reducer logic that is looking for that action type.
  170. *
  171. * @param type The action type to use for created actions.
  172. * @param prepare (optional) a method that takes any number of arguments and returns { payload } or { payload, meta }.
  173. * If this is given, the resulting action creator will pass its arguments to this method to calculate payload & meta.
  174. *
  175. * @public
  176. */
  177. export declare function createAction<PA extends PrepareAction<any>, T extends string = string>(type: T, prepareAction: PA): PayloadActionCreator<ReturnType<PA>['payload'], T, PA>;
  178. /**
  179. * Returns true if value is a plain object with a `type` property.
  180. */
  181. export declare function isAction(action: unknown): action is Action<unknown>;
  182. /**
  183. * Returns true if value is an RTK-like action creator, with a static type property and match method.
  184. */
  185. export declare function isActionCreator(action: unknown): action is BaseActionCreator<unknown, string> & Function;
  186. /**
  187. * Returns true if value is an action with a string type and valid Flux Standard Action keys.
  188. */
  189. export declare function isFSA(action: unknown): action is {
  190. type: string;
  191. payload?: unknown;
  192. error?: unknown;
  193. meta?: unknown;
  194. };
  195. /**
  196. * Returns the action type of the actions created by the passed
  197. * `createAction()`-generated action creator (arbitrary action creators
  198. * are not supported).
  199. *
  200. * @param action The action creator whose action type to get.
  201. * @returns The action type used by the action creator.
  202. *
  203. * @public
  204. */
  205. export declare function getType<T extends string>(actionCreator: PayloadActionCreator<any, T>): T;
  206. declare type IfPrepareActionMethodProvided<PA extends PrepareAction<any> | void, True, False> = PA extends (...args: any[]) => any ? True : False;
  207. export {};