aikoven / typescript-fsa

Type-safe action creator utilities
MIT License
607 stars 28 forks source link

Allow For Passing Meta Type ActionCreatorFactory.async and AsyncActionCreators #62

Open dcurletti opened 6 years ago

dcurletti commented 6 years ago

Hi there-

Issue: I am unable to pass a TypeScript Type for the meta object that an actionCreator produces.


Example: I want to create async actions for an event "login":

interface LogInData { email: string }
interface LogInResponseData { token: string }
interface LogInErrorData { error: string }

const logIn = actionCreator.async<LogInData, LogInResponseData, LogInErrorData>('LOGIN');

I also want to pass data via the meta object on the action.

dispatch(login.started({email: 'd@d.com'}, {info: true}))

I now want to define what my action will look like, as well as create the saga:

import {Action} from 'redux';

interface LoginAction extends Action {
  meta: { info: boolean }
}

export function* loginFunc(action: LoginAction) {
  ...irrelevant
}

takeEvery(logIn.started,loginFunc),

The issue arises when you try to test the code:

const startAction = logIn.start({email: 'test@test.com'}, {info: true})

loginFunc(startAction)

startAction will throw a TypeScript error because its meta property has a different definition than that of LoginAction


My suggestion would be to add something like:

const logIn = actionCreator.async<LogInData, LogInResponseData, LogInErrorData, MetaData>('LOGIN');
aikoven commented 6 years ago

This sounds good to me, especially since we can now use defaults for generic parameters, so this won't break existing code.

However, I don't really have much time to work on this now, but I'd happily accept PRs!