Typesafe utilities for "action-creators" in Redux / Flux Architecture
MIT License
Bot releases are hidden (Show)
v5
all the deprecated v4
creator functions are available under deprecated
named import to help with incremental migration.// before
import { createAction, createStandardAction, createCustomAction } from "typesafe-actions"
// after
import { deprecated } from "typesafe-actions"
const { createAction, createStandardAction, createCustomAction } = deprecated;
createStandardAction
was renamed to createAction
and .map
method was removed in favor of simpler redux-actions
style API.// before
const withMappedPayloadAndMeta = createStandardAction(
'CREATE_STANDARD_ACTION'
).map(({ username, message }: Notification) => ({
payload: `${username}: ${message}`,
meta: { username, message },
}));
// after
const withMappedPayloadAndMeta = createAction(
'CREATE_STANDARD_ACTION',
({ username, message }: Notification) => `${username}: ${message}`, // payload creator
({ username, message }: Notification) => ({ username, message }) // meta creator
)();
v4
version of createAction
was removed. I suggest to refactor to use a new createAction
as in point 2
, which was simplified and extended to support redux-actions
style API.// before
const withPayloadAndMeta = createAction('CREATE_ACTION', resolve => {
return (id: number, token: string) => resolve(id, token);
});
// after
const withPayloadAndMeta = createAction(
'CREATE_ACTION',
(id: number, token: string) => id, // payload creator
(id: number, token: string) => token // meta creator
})();
createCustomAction
- API was greatly simplified, now it's used like this:// before
const add = createCustomAction('CUSTOM', type => {
return (first: number, second: number) => ({ type, customProp1: first, customProp2: second });
});
// after
const add = createCustomAction(
'CUSTOM',
(first: number, second: number) => ({ customProp1: first, customProp2: second })
);
AsyncActionCreator
should be just renamed to AsyncActionCreatorBuilder
.// before
import { AsyncActionCreator } from "typesafe-actions"
//after
import { AsyncActionCreatorBuilder } from "typesafe-actions"
createAction
& createAsyncAction
API (#192).npmignore
. Fixed #205createReducer
a typesafe reducer factory using object map and chain API #106From v4.x.x
all action creators will use undefined
instead of void
as a generic type parameter to make the action-creator function require NO parameters.
Background discussion: https://github.com/piotrwitek/typesafe-actions/issues/124#issuecomment-479446603
const increment = createStandardAction('INCREMENT')<undefined>();
increment(); // <= no parameters required
const fetchUsers = createAsyncAction(
'FETCH_USERS_REQUEST',
'FETCH_USERS_SUCCESS',
'FETCH_USERS_FAILURE'
)<undefined, User[], Error>();
fetchUsers.request(); // <= no parameters required
action
and createAction
have new 3rd parameter which is error property on action object making it fully FSA compliant.
import { action, createAction } from 'typesafe-actions';
export const todosError = (message: string) => action('todos/ERROR', message, undefined, true);
// todosError: (message: string) => { type: "todos/ADD"; payload: string; error: boolean; }
export const todosError = createAction('todos/ERROR', action => {
// Note: "action" callback does not need "type" parameter
return (message: string) => action(message, undefined, true);
});
// todosError: (message: string) => { type: "todos/ADD"; payload: string; error: boolean; }
Fixed #117
Fixed #118
Create an enhanced action-creator with unlimited number of arguments and custom properties on action object.
(id, firstName, lastName)
.({ type, customProp1, customProp2, ...customPropN })
createCustomAction(type, type => {
return (namedArg1, namedArg2, ...namedArgN) => ({ type, customProp1, customProp2, ...customPropN })
})
Examples:
> Advanced Usage Examples
import { createCustomAction } from 'typesafe-actions';
const add = createCustomAction('CUSTOM', type => {
return (first: number, second: number) => ({ type, customProp1: first, customProp2: second });
});
add(1) // { type: "CUSTOM"; customProp1: number; customProp2: number; }
From v3.x.x the minimum required TS version is v3.2.
This allow us to benefit from new type-checker features like tuple types and to simplify some existing complexity in function overloads.
This should help us in the long run to implement new features faster.