Skip to content

Commit

Permalink
feat(ts): use generic rest params with TS 3.0
Browse files Browse the repository at this point in the history
  • Loading branch information
omichelsen committed Jul 30, 2018
1 parent 6a8133a commit f98e450
Show file tree
Hide file tree
Showing 4 changed files with 17 additions and 36 deletions.
6 changes: 3 additions & 3 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
"nyc": "^12.0.2",
"ts-node": "^7.0.0",
"tslint": "^5.11.0",
"typescript": "^2.9.2"
"typescript": "^3.0.1"
},
"nyc": {
"extension": [
Expand Down
33 changes: 8 additions & 25 deletions src/actions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,36 +17,19 @@ export type ActionFunctionAny<R> = (...args: any[]) => R;

export function createAction(
type: string
): ActionFunction0<IAction<undefined>>;
): () => IAction<undefined>;

export function createAction<Payload>(
export function createAction<Payload, U extends any[]>(
type: string,
payloadCreator: () => Payload
): ActionFunction0<IAction<Payload>>;
payloadCreator: (...args: U) => Payload
): (...args: U) => IAction<Payload>;

export function createAction<Payload, Arg1>(
export function createAction<Payload, U extends any[]>(
type: string,
payloadCreator: ActionFunction1<Arg1, Payload>
): ActionFunction1<Arg1, IAction<Payload>>;

export function createAction<Payload, Arg1, Arg2>(
type: string,
payloadCreator: ActionFunction2<Arg1, Arg2, Payload>
): ActionFunction2<Arg1, Arg2, IAction<Payload>>;

export function createAction<Payload, Arg1, Arg2, Arg3>(
type: string,
payloadCreator: ActionFunction3<Arg1, Arg2, Arg3, Payload>
): ActionFunction3<Arg1, Arg2, Arg3, IAction<Payload>>;

export function createAction<Payload, Arg1, Arg2, Arg3, Arg4>(
type: string,
payloadCreator: ActionFunction4<Arg1, Arg2, Arg3, Arg4, Payload>
): ActionFunction4<Arg1, Arg2, Arg3, Arg4, IAction<Payload>>;

export function createAction<Payload>(type: string, payloadCreator?: (...args: any[]) => Payload) {
payloadCreator?: (...args: U) => Payload
): (...args: U) => IAction<Payload> {
return Object.assign(
(...args: any[]) => ({
(...args: U) => ({
type,
...(payloadCreator && { payload: payloadCreator(...args) }),
}),
Expand Down
12 changes: 5 additions & 7 deletions test/actions.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,14 @@ describe('actions', () => {
const TYPE = 'TEST_ACTION';

describe('createAction', () => {
it('should create an action object with type', () => {
assert.equal(createAction(TYPE)().type, TYPE);
});

it('should create an action object with no payload', () => {
assert.equal(createAction(TYPE)().payload, undefined);
it('should create an action object with type and no payload', () => {
const action = createAction(TYPE);
assert.deepEqual(action(), { type: TYPE });
});

it('should output action name on toString()', () => {
assert.equal(createAction(TYPE).toString(), TYPE);
const action = createAction(TYPE);
assert.equal(action.toString(), TYPE);
});

it('should add the input to the payload', () => {
Expand Down

0 comments on commit f98e450

Please sign in to comment.