Skip to content

Commit

Permalink
always return PayloadAction from PayloadActionCreator
Browse files Browse the repository at this point in the history
  • Loading branch information
phryneas committed Jul 16, 2019
1 parent aec760c commit a960dc6
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 27 deletions.
21 changes: 3 additions & 18 deletions src/createAction.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,26 +24,11 @@ export type PayloadActionCreator<P = any, T extends string = string> = { type: T
* of contra-variant types.
*/
[undefined] extends [P] ? {
// not sure which behavious fits better

/*
* actionCreator() => Action<T>
* actionCreator(undefined) => Action<T>
* actionCreator("foo") => PayloadAction<"foo", T>
*/
(payload?: undefined): Action<T>
(payload?: undefined): PayloadAction<undefined, T>
<PT extends Diff<P, undefined>>(payload?: PT): PayloadAction<PT, T>

/*
* actionCreator() => Action<T>
* actionCreator(undefined) => PayloadAction<undefined, T>
* actionCreator("foo") => PayloadAction<"foo", T>
*/
// (): Action<T>
// <PT extends P>(payload: PT): PayloadAction<PT, T>
}
: [void] extends [P] ? {
(): Action<T>
(): PayloadAction<undefined, T>
}
: {
<PT extends P>(payload: PT): PayloadAction<PT, T>
Expand All @@ -62,7 +47,7 @@ export type PayloadActionCreator<P = any, T extends string = string> = { type: T
export function createAction<P = any, T extends string = string>(
type: T
): PayloadActionCreator<P, T> {
function actionCreator(payload?: P): Action<T> | PayloadAction<P, T> {
function actionCreator(payload?: P): PayloadAction<undefined | P, T> {
return { type, payload }
}

Expand Down
18 changes: 9 additions & 9 deletions type-tests/files/createAction.typetest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import {
AnyAction
} from 'redux-starter-kit'

function expectType<T>(p: T) { }

/* PayloadAction */

/*
Expand Down Expand Up @@ -50,7 +52,7 @@ import {
/* PayloadActionCreator */

/*
* Test: PayloadActionCreator returns Action or PayloadAction depending
* Test: PayloadActionCreator returns correctly typed PayloadAction depending
* on whether a payload is passed.
*/
{
Expand All @@ -62,16 +64,14 @@ import {
{ type: 'action' }
) as PayloadActionCreator

let action: Action
let payloadAction: PayloadAction

action = actionCreator()
action = actionCreator(undefined)
action = actionCreator(1)
payloadAction = actionCreator(1)
expectType<PayloadAction<number>>(actionCreator(1));
expectType<PayloadAction<undefined>>(actionCreator());
expectType<PayloadAction<undefined>>(actionCreator(undefined));

// typings:expect-error
payloadAction = actionCreator()
expectType<PayloadAction<number>>(actionCreator());
// typings:expect-error
expectType<PayloadAction<undefined>>(actionCreator(1));
}

/*
Expand Down

0 comments on commit a960dc6

Please sign in to comment.