import IAllState from '../../../store/models/_i-all-state'; export interface IRootState { rootState: IAllState; } export const mapAllStateAsRootStateToProps = (state: IAllState): IRootState => ({rootState: state}); // Following looks harder to read than the normal function export const mapDestructuredStatesToPropsHard = <T>(mapper: (rootState: IAllState) => T): (rootState: IAllState) => T & IRootState => rootState => // tslint:disable prefer-object-spread Object.assign({}, {rootState}, mapper(rootState)); // Less hard than above. The exported expression is not mangled with too much types. type IMapper = <T>(mapper: (rootState: IAllState) => T) => (rootState: IAllState) => T & IRootState; export const mapDestructuredStatesToPropsLessHard: IMapper = mapper => rootState => // tslint:disable prefer-object-spread Object.assign({}, {rootState}, mapper(rootState)); // Nested arrow function looks hard, especially with TypeScript, since it's harder to decipher // if the things that comes after the arrow is an executing code or if it is just a type. // So despite some people going gaga over arrow functions, // but some prefer to use normal functions when nested arrow functions mangles the readability of the code. export function mapDestructuredStatesToProps <T>(mapper: (rootState: IAllState) => T): (rootState: IAllState) => T & IRootState { return rootState => // tslint:disable prefer-object-spread Object.assign({}, {rootState}, mapper(rootState)); }
Happy Coding!
No comments:
Post a Comment