diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..811fb17 --- /dev/null +++ b/index.d.ts @@ -0,0 +1,14 @@ +declare function deepmerge(x: Partial, y: Partial, options?: deepmerge.Options): T; +declare function deepmerge(x: Partial, y: Partial, options?: deepmerge.Options): T1 & T2; + +declare namespace deepmerge { + export interface Options { + arrayMerge?(target: any[], source: any[], options?: Options): any[]; + clone?: boolean; + isMergeableObject?(value: object): boolean; + } + + export function all (objects: object[], options?: Options): object; +} + +export default deepmerge; diff --git a/package-lock.json b/package-lock.json index f47d3c5..dd14163 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2892,6 +2892,12 @@ "prelude-ls": "1.1.2" } }, + "typescript": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.2.2.tgz", + "integrity": "sha1-YGAiUIR5tV/6NotY/uljoD39eww=", + "dev": true + }, "uglify-js": { "version": "3.3.12", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.12.tgz", diff --git a/package.json b/package.json index cfd1a06..7e0ea50 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ }, "scripts": { "build": "rollup -c", - "test": "npm run build && tap test/*.js && jsmd readme.md", + "test": "npm run build && tap test/*.js && jsmd readme.md && tsc --noEmit test/typescript.ts", "size": "npm run build && uglifyjs --compress --mangle -- ./dist/umd.js | gzip -c | wc -c" }, "devDependencies": { @@ -34,6 +34,7 @@ "rollup-plugin-commonjs": "8.2.1", "rollup-plugin-node-resolve": "3.0.0", "tap": "~7.1.2", + "typescript": "=2.2.2", "uglify-js": "^3.3.12" }, "license": "MIT" diff --git a/test/typescript.ts b/test/typescript.ts new file mode 100644 index 0000000..c1f183d --- /dev/null +++ b/test/typescript.ts @@ -0,0 +1,50 @@ +import merge from '../'; + +const x = { + foo: 'abc', + bar: 'def', +} + +const y = { + foo: 'cba', + bar: 'fed', +} + +const z = { + baz: '123', + quux: '456', +} + +let merged1 = merge(x, y); +let merged2 = merge(x, z); +let merged3 = merge.all([ x, y, z ]); + +merged1.foo; +merged1.bar; +merged2.foo; +merged2.baz; + +const options1: merge.Options = { + clone: true, + isMergeableObject (obj) { + return true; + }, +}; + +const options2: merge.Options = { + arrayMerge (target, source, options) { + target.length; + source.length; + options.isMergeableObject(target); + + return []; + }, + clone: true, + isMergeableObject (obj) { + return true; + }, +}; + +merged1 = merge(x, y, options1); +merged2 = merge(x, z, options2); +merged3 = merge([x, y, z], options1);