diff --git a/packages/utils/deep-assign.ts b/packages/utils/deep-assign.ts index 3b5f592a3..e2a4653e9 100644 --- a/packages/utils/deep-assign.ts +++ b/packages/utils/deep-assign.ts @@ -11,7 +11,7 @@ function assignKey(to: ObjectIndex, from: ObjectIndex, key: string) { return; } - if (!hasOwnProperty.call(to, key) || !isObj(val)) { + if (!hasOwnProperty.call(to, key) || !isObj(val) || typeof val === 'function') { to[key] = val; } else { to[key] = deepAssign(Object(to[key]), from[key]); diff --git a/packages/utils/test/index.spec.js b/packages/utils/test/index.spec.js index d2bebae65..0b8ff6432 100644 --- a/packages/utils/test/index.spec.js +++ b/packages/utils/test/index.spec.js @@ -1,4 +1,5 @@ import { deepClone } from '../deep-clone'; +import { deepAssign } from '../deep-assign'; import { isDef, get } from '..'; import { raf, cancelRaf } from '../dom/raf'; import { later } from '../../../test/utils'; @@ -11,7 +12,7 @@ import { camelize } from '../format/string'; test('deepClone', () => { const a = { foo: 0 }; const b = { foo: 0, bar: 1 }; - const fn = () => { }; + const fn = () => {}; const arr = [a, b]; expect(deepClone(a)).toEqual(a); expect(deepClone(b)).toEqual(b); @@ -21,13 +22,30 @@ test('deepClone', () => { expect(deepClone(1)).toEqual(1); }); +test('deepAssign', () => { + const fn = () => {}; + + expect(deepAssign({}, { foo: null })).toEqual({}); + expect(deepAssign({}, { foo: undefined })).toEqual({}); + expect(deepAssign({ fn: null }, { fn })).toEqual({ fn }); + expect(deepAssign({ foo: 0 }, { bar: 1 })).toEqual({ foo: 0, bar: 1 }); + expect(deepAssign({ foo: { bar: false } }, { foo: { bar: true, foo: false } })).toEqual( + { + foo: { + bar: true, + foo: false + } + } + ); +}); + test('isDef', () => { expect(isDef(null)).toBeFalsy(); expect(isDef(undefined)).toBeFalsy(); expect(isDef(1)).toBeTruthy(); expect(isDef('1')).toBeTruthy(); expect(isDef({})).toBeTruthy(); - expect(isDef(() => { })).toBeTruthy(); + expect(isDef(() => {})).toBeTruthy(); }); test('camelize', () => {