diff --git a/packages/common/src/filterProps.test.ts b/packages/common/src/filterProps.test.ts new file mode 100644 index 0000000..ac696e5 --- /dev/null +++ b/packages/common/src/filterProps.test.ts @@ -0,0 +1,35 @@ +import {createFilterProps} from './filterProps' + +interface IEntity { + readonly id: number +} + +interface IPerson { + readonly firstName: string + readonly lastName: string +} + +interface IPersonEntity extends IEntity, IPerson {} + +describe('filterProps', () => { + + const p: IPersonEntity = { + id: 1, + firstName: 'John', + lastName: 'Smith', + } + + const filterProps = createFilterProps({ + firstName: true, + lastName: true, + }) + + it('picks only relevant props', () => { + const person = filterProps(p) + expect(person).toEqual({ + firstName: 'John', + lastName: 'Smith', + }) + }) + +}) diff --git a/packages/common/src/filterProps.ts b/packages/common/src/filterProps.ts new file mode 100644 index 0000000..67cbbd8 --- /dev/null +++ b/packages/common/src/filterProps.ts @@ -0,0 +1,8 @@ +export function createFilterProps(schema: Record) { + return function filterProps(item: U): T { + return Object.keys(schema).reduce((obj: T, key) => { + obj[key as keyof T] = item[key as keyof T] + return obj + }, {} as T) + } +} diff --git a/packages/common/src/index.ts b/packages/common/src/index.ts index 7e57cae..23219da 100644 --- a/packages/common/src/index.ts +++ b/packages/common/src/index.ts @@ -10,6 +10,7 @@ export * from './IUser' export * from './IUserInTeam' export * from './IUserTeam' export * from './URLFormatter' +export * from './filterProps' export * from './indexBy' export * from './types' export * from './without'