Skip to content

Instantly share code, notes, and snippets.

@asvetly
Created June 8, 2019 11:37
Show Gist options
  • Save asvetly/aba97c52017e710d744a81397cfd5e01 to your computer and use it in GitHub Desktop.
Save asvetly/aba97c52017e710d744a81397cfd5e01 to your computer and use it in GitHub Desktop.
/**
* Maps selector objects with keys
*
* @param { SelectorsMapObject } selectorsMapObject selectors map object
* @returns { SelectorsObject } selectors object
*/
export function combineSelectors<S extends SelectorsMapObject, K extends keyof S>(selectorsMapObject: S): S[K] {
const combinedSelectors = {};
Object.keys(selectorsMapObject).forEach(key => {
if (process.env.NODE_ENV !== 'production') {
if (typeof selectorsMapObject[key] === 'undefined')
warning(`No selector or selectorsObject provided for key "${ key }"`);
}
if (typeof selectorsMapObject[key] === 'object') {
const storeKey = key;
Object.keys(selectorsMapObject[storeKey]).forEach(selectorKey => {
if (process.env.NODE_ENV !== 'production') {
if (typeof selectorsMapObject[storeKey][selectorKey] === 'undefined')
warning(`No selector provided for key "${ selectorKey }"`);
else if (typeof selectorsMapObject[storeKey][selectorKey] !== 'function')
warning(`No selector provided for key "${ selectorKey }"`);
}
if (typeof selectorsMapObject[storeKey][selectorKey] === 'function')
combinedSelectors[selectorKey] = (state, ...args) =>
selectorsMapObject[key][selectorKey](state[storeKey], ...args);
});
}
});
return combinedSelectors as S[K];
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment