angular-redux / ng-redux

Angular bindings for Redux
MIT License
1.16k stars 178 forks source link

[TS] Type safety is not good enough when using $ngRedux.connect() #207

Open arutkowski00 opened 5 years ago

arutkowski00 commented 5 years ago

Hello, let me present you some code to start with:

import { INgRedux } from 'ng-redux';

import { RootState } from '../';

import * as actions from './actions';
import * as selectors from './selectors';

export class FooController implements ng.IController {
  readonly bar: ReturnType<typeof selectors.getBar>;
  readonly fooBar: ReturnType<typeof selectors.getFooBar>;

  readonly load: typeof actions.load;
  readonly save: typeof actions.save;

  /* @ngInject */
  constructor(private $ngRedux: INgRedux) {
    $ngRedux.connect((state: RootState) => ({
      bar: selectors.getBar(state),
      fooBar: selectors.getFooBar(state),
    }), actions)(this);
  }
}

As you can clearly see, I have to repeat declarations twice: once, in $ngRedux.connect() and second, in the controller to be type-safe. If, for some reason, I start refactoring this code, by changing names of properties in connect() or changing the action creators' names imported in ./actions, this code will not throw any compilation error.

Question: is there a way to improve type-safety with $ngRedux.connect()? Maybe connect() should limit properties/actions in map***ToTarget to only those that are declared in the controller?