diff --git a/index.d.ts b/index.d.ts index 7412fcf..7bf9cde 100644 --- a/index.d.ts +++ b/index.d.ts @@ -1,5 +1,21 @@ -declare function deepmerge(x: Partial, y: Partial, options?: deepmerge.Options): T; -declare function deepmerge(x: Partial, y: Partial, options?: deepmerge.Options): T1 & T2; +type ValueOfKey = K extends keyof T ? T[K] : never; +// Is object AND NOT ('never' or 'array') +type IsObject = [T] extends [never] ? false : T extends unknown[] ? false : [T] extends [object] ? true : false; +type ShouldMergeProps = IsObject extends false ? false : IsObject extends false ? false : true; +type DeepMerge = ShouldMergeProps extends true + ? { + [K in keyof T1 | keyof T2]: DeepMerge, ValueOfKey>; + } + : T1 | T2; + +/** +* ## JS Object Deep Merge +* look more info in https://github.com/TehShrike/deepmerge +* @param x the first obj +* @param y the second obj +* @param options deepmerge option +*/ +declare function deepmerge(x: T1, y: T2, options?: deepmerge.Options): DeepMerge declare namespace deepmerge { export interface Options { diff --git a/package-lock.json b/package-lock.json index c112ccb..b809bad 100644 --- a/package-lock.json +++ b/package-lock.json @@ -328,7 +328,7 @@ "esprima": "^2.7.3", "estraverse": "^4.2.0", "marked": "^0.7.0", - "v8-argv": "github:jkroso/v8-argv#1.1.1" + "v8-argv": "github:jkroso/v8-argv#284f84379e292eb956a5e7b66fb953ec4974385e" } }, "levn": { @@ -644,9 +644,9 @@ } }, "typescript": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.2.2.tgz", - "integrity": "sha1-YGAiUIR5tV/6NotY/uljoD39eww=", + "version": "3.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.3.tgz", + "integrity": "sha512-D/wqnB2xzNFIcoBG9FG8cXRDjiqSTbG2wd8DMZeQyJlP1vfTkIxH4GKveWaEBYySKIg+USu+E+EDIR47SqnaMQ==", "dev": true }, "uglify-js": { diff --git a/package.json b/package.json index 99ed0d6..506e00a 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "rollup-plugin-node-resolve": "^5.2.0", "tape": "^4.11.0", "ts-node": "7.0.1", - "typescript": "=2.2.2", + "typescript": "^3.9.3", "uglify-js": "^3.6.1" }, "license": "MIT", diff --git a/test/typescript.ts b/test/typescript.ts index 23d2c5c..489cc3d 100644 --- a/test/typescript.ts +++ b/test/typescript.ts @@ -63,3 +63,51 @@ merged2 = merge(x, z, options2); merged3 = merge.all<{wat: number}>([x, y, z], options1); const merged4 = merge(x, y, options3); + +const t1 = { + key1: 'key1-val', + key2: { + key2key1: [false, 'true'] + }, + key3: { + key3key1: { + key3key1key1: 'key3key1key1-val', + key3key1key2: true, + key3key1key3: ['key3key1key3-val'] + }, + key3key2: ['key3key2-val'] + } +}; + +const t2 = { + key1: ['key1-val'], + key2: { + key2key1: { + key2key1key1: () => 'key2key1key1-val', + key2key1key2: true, + key2key1key3: ['key2key1key3-val'] + } + }, + key3: { + key3key1: () => false, + key3key2: ['key3key2-val', true] + } +}; + +const merged5: { + key1: string | string[]; + key2: { + key2key1: (string | boolean)[] | { + key2key1key1: () => string; + key2key1key2: boolean; + key2key1key3: string[]; + }; + }; + key3: { + key3key1: { + key3key1key1: string;key3key1key2: boolean; + key3key1key3: string[]; + }; + key3key2: (string | boolean)[] | string[]; + }; +} = merge(t1, t2);