diff --git a/src/composeProps.ts b/src/composeProps.ts new file mode 100644 index 00000000..f225dd1e --- /dev/null +++ b/src/composeProps.ts @@ -0,0 +1,23 @@ +function composeProps>( + originProps: T, + patchProps: Partial, + isAll?: boolean, +) { + const composedProps: Record = { + ...originProps, + ...(isAll ? patchProps : {}), + }; + + Object.keys(patchProps).forEach(key => { + const func = patchProps[key]; + if (typeof func === 'function') { + composedProps[key] = (...args) => { + func(...args); + return originProps[key](...args); + }; + } + }); + return composedProps; +} + +export default composeProps; diff --git a/tests/composeProps.test.js b/tests/composeProps.test.js new file mode 100644 index 00000000..c6b0d389 --- /dev/null +++ b/tests/composeProps.test.js @@ -0,0 +1,39 @@ +import composeProps from '../src/composeProps'; + +describe('composeProps', () => { + it('composeProps all', () => { + const aChange = jest.fn(); + const aBlur = jest.fn(); + const bChange = jest.fn(); + const sourceProps = { value: '11', onChange: aChange, onBlur: aBlur }; + const patchProps = { onChange: bChange, placeholder: 'x' }; + + const props = composeProps(sourceProps, patchProps, true); + props.onChange(); + props.onBlur(); + expect(aChange).toHaveBeenCalled(); + expect(aBlur).toHaveBeenCalled(); + expect(bChange).toHaveBeenCalled(); + expect(Object.keys(props)).toEqual([ + 'value', + 'onChange', + 'onBlur', + 'placeholder', + ]); + }); + it('composeProps just func', () => { + const aChange = jest.fn(); + const aBlur = jest.fn(); + const bChange = jest.fn(); + const sourceProps = { value: '11', onChange: aChange, onBlur: aBlur }; + const patchProps = { onChange: bChange, placeholder: 'x' }; + + const props = composeProps(sourceProps, patchProps); + props.onChange(); + props.onBlur(); + expect(aChange).toHaveBeenCalled(); + expect(aBlur).toHaveBeenCalled(); + expect(bChange).toHaveBeenCalled(); + expect(Object.keys(props)).toEqual(['value', 'onChange', 'onBlur']); + }); +});