From 76a5b69dddfeae973d5a988f4dd74170c57823f8 Mon Sep 17 00:00:00 2001 From: yinz Date: Thu, 5 Jan 2023 01:12:42 +0800 Subject: [PATCH] feat: better `Array#includes` #17 --- generated/lib.es2016.array.include.d.ts | 16 +- lib/lib.es2016.array.include.d.ts | 17 ++ package-lock.json | 4 +- tests/package-lock.json | 271 ++++++++++-------------- tests/src/es2016.array.include.ts | 43 ++++ 5 files changed, 189 insertions(+), 162 deletions(-) create mode 100644 lib/lib.es2016.array.include.d.ts create mode 100644 tests/src/es2016.array.include.ts diff --git a/generated/lib.es2016.array.include.d.ts b/generated/lib.es2016.array.include.d.ts index 94160e8..bf1c6d2 100644 --- a/generated/lib.es2016.array.include.d.ts +++ b/generated/lib.es2016.array.include.d.ts @@ -4,8 +4,14 @@ interface Array { * @param searchElement The element to search for. * @param fromIndex The position in this array at which to begin searching for searchElement. */ - includes(searchElement: T, fromIndex?: number): boolean; + includes(searchElement: unknown, fromIndex?: number): searchElement is T; } +// /** +// * Determines whether an array includes a certain element, returning true or false as appropriate. +// * @param searchElement The element to search for. +// * @param fromIndex The position in this array at which to begin searching for searchElement. +// */ +// includes(searchElement: T, fromIndex?: number): boolean; interface ReadonlyArray { /** @@ -13,8 +19,14 @@ interface ReadonlyArray { * @param searchElement The element to search for. * @param fromIndex The position in this array at which to begin searching for searchElement. */ - includes(searchElement: T, fromIndex?: number): boolean; + includes(searchElement: unknown, fromIndex?: number): searchElement is T; } +// /** +// * Determines whether an array includes a certain element, returning true or false as appropriate. +// * @param searchElement The element to search for. +// * @param fromIndex The position in this array at which to begin searching for searchElement. +// */ +// includes(searchElement: T, fromIndex?: number): boolean; interface Int8Array { /** diff --git a/lib/lib.es2016.array.include.d.ts b/lib/lib.es2016.array.include.d.ts new file mode 100644 index 0000000..4abdeb1 --- /dev/null +++ b/lib/lib.es2016.array.include.d.ts @@ -0,0 +1,17 @@ +interface Array { + /** + * Determines whether an array includes a certain element, returning true or false as appropriate. + * @param searchElement The element to search for. + * @param fromIndex The position in this array at which to begin searching for searchElement. + */ + includes(searchElement: unknown, fromIndex?: number): searchElement is T; +} + +interface ReadonlyArray { + /** + * Determines whether an array includes a certain element, returning true or false as appropriate. + * @param searchElement The element to search for. + * @param fromIndex The position in this array at which to begin searching for searchElement. + */ + includes(searchElement: unknown, fromIndex?: number): searchElement is T; +} diff --git a/package-lock.json b/package-lock.json index 7e0a7c9..f2be612 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "better-typescript-lib", - "version": "2.1.0", + "version": "2.2.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "better-typescript-lib", - "version": "2.1.0", + "version": "2.2.0", "license": "Apache-2.0", "devDependencies": { "@jsdevtools/npm-publish": "^1.4.3", diff --git a/tests/package-lock.json b/tests/package-lock.json index b25cb41..0434432 100644 --- a/tests/package-lock.json +++ b/tests/package-lock.json @@ -29,119 +29,6 @@ "typescript": "^4.6.4" } }, - "../dist-package/dom": { - "name": "@better-typescript-lib/dom", - "version": "2.1.0", - "license": "Apache-2.0", - "peerDependencies": { - "typescript": ">=4.5.2" - } - }, - "../dist-package/es2015": { - "name": "@better-typescript-lib/es2015", - "version": "2.1.0", - "license": "Apache-2.0", - "peerDependencies": { - "typescript": ">=4.5.2" - } - }, - "../dist-package/es2016": { - "name": "@better-typescript-lib/es2016", - "version": "2.1.0", - "license": "Apache-2.0", - "peerDependencies": { - "typescript": ">=4.5.2" - } - }, - "../dist-package/es2017": { - "name": "@better-typescript-lib/es2017", - "version": "2.1.0", - "license": "Apache-2.0", - "peerDependencies": { - "typescript": ">=4.5.2" - } - }, - "../dist-package/es2018": { - "name": "@better-typescript-lib/es2018", - "version": "2.1.0", - "license": "Apache-2.0", - "peerDependencies": { - "typescript": ">=4.5.2" - } - }, - "../dist-package/es2019": { - "name": "@better-typescript-lib/es2019", - "version": "2.1.0", - "license": "Apache-2.0", - "peerDependencies": { - "typescript": ">=4.5.2" - } - }, - "../dist-package/es2020": { - "name": "@better-typescript-lib/es2020", - "version": "2.1.0", - "license": "Apache-2.0", - "peerDependencies": { - "typescript": ">=4.5.2" - } - }, - "../dist-package/es2021": { - "name": "@better-typescript-lib/es2021", - "version": "2.1.0", - "license": "Apache-2.0", - "peerDependencies": { - "typescript": ">=4.5.2" - } - }, - "../dist-package/es2022": { - "name": "@better-typescript-lib/es2022", - "version": "2.1.0", - "license": "Apache-2.0", - "peerDependencies": { - "typescript": ">=4.5.2" - } - }, - "../dist-package/es5": { - "name": "@better-typescript-lib/es5", - "version": "2.1.0", - "license": "Apache-2.0", - "peerDependencies": { - "typescript": ">=4.5.2" - } - }, - "../dist-package/esnext": { - "name": "@better-typescript-lib/esnext", - "version": "2.1.0", - "integrity": "sha1-1aczY1lVFLRpoWBIvz39vBC4NWs=", - "license": "Apache-2.0", - "peerDependencies": { - "typescript": ">=4.5.2" - } - }, - "../dist-package/header": { - "name": "@better-typescript-lib/header", - "version": "2.1.0", - "license": "Apache-2.0", - "peerDependencies": { - "typescript": ">=4.5.2" - } - }, - "../dist-package/scripthost": { - "name": "@better-typescript-lib/scripthost", - "version": "2.1.0", - "license": "Apache-2.0", - "peerDependencies": { - "typescript": ">=4.5.2" - } - }, - "../dist-package/webworker": { - "name": "@better-typescript-lib/webworker", - "version": "2.1.0", - "license": "Apache-2.0", - "peerDependencies": { - "typescript": ">=4.5.2" - } - }, "node_modules/@babel/code-frame": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", @@ -321,60 +208,130 @@ "dev": true }, "node_modules/@typescript/lib-dom": { - "resolved": "../dist-package/dom", - "link": true + "name": "@better-typescript-lib/dom", + "version": "2.2.0", + "resolved": "file:../dist-package/dom", + "license": "Apache-2.0", + "peerDependencies": { + "typescript": ">=4.5.2" + } }, "node_modules/@typescript/lib-es2015": { - "resolved": "../dist-package/es2015", - "link": true + "name": "@better-typescript-lib/es2015", + "version": "2.2.0", + "resolved": "file:../dist-package/es2015", + "license": "Apache-2.0", + "peerDependencies": { + "typescript": ">=4.5.2" + } }, "node_modules/@typescript/lib-es2016": { - "resolved": "../dist-package/es2016", - "link": true + "name": "@better-typescript-lib/es2016", + "version": "2.2.0", + "resolved": "file:../dist-package/es2016", + "license": "Apache-2.0", + "peerDependencies": { + "typescript": ">=4.5.2" + } }, "node_modules/@typescript/lib-es2017": { - "resolved": "../dist-package/es2017", - "link": true + "name": "@better-typescript-lib/es2017", + "version": "2.2.0", + "resolved": "file:../dist-package/es2017", + "license": "Apache-2.0", + "peerDependencies": { + "typescript": ">=4.5.2" + } }, "node_modules/@typescript/lib-es2018": { - "resolved": "../dist-package/es2018", - "link": true + "name": "@better-typescript-lib/es2018", + "version": "2.2.0", + "resolved": "file:../dist-package/es2018", + "license": "Apache-2.0", + "peerDependencies": { + "typescript": ">=4.5.2" + } }, "node_modules/@typescript/lib-es2019": { - "resolved": "../dist-package/es2019", - "link": true + "name": "@better-typescript-lib/es2019", + "version": "2.2.0", + "resolved": "file:../dist-package/es2019", + "license": "Apache-2.0", + "peerDependencies": { + "typescript": ">=4.5.2" + } }, "node_modules/@typescript/lib-es2020": { - "resolved": "../dist-package/es2020", - "link": true + "name": "@better-typescript-lib/es2020", + "version": "2.2.0", + "resolved": "file:../dist-package/es2020", + "license": "Apache-2.0", + "peerDependencies": { + "typescript": ">=4.5.2" + } }, "node_modules/@typescript/lib-es2021": { - "resolved": "../dist-package/es2021", - "link": true + "name": "@better-typescript-lib/es2021", + "version": "2.2.0", + "resolved": "file:../dist-package/es2021", + "license": "Apache-2.0", + "peerDependencies": { + "typescript": ">=4.5.2" + } }, "node_modules/@typescript/lib-es2022": { - "resolved": "../dist-package/es2022", - "link": true + "name": "@better-typescript-lib/es2022", + "version": "2.2.0", + "resolved": "file:../dist-package/es2022", + "license": "Apache-2.0", + "peerDependencies": { + "typescript": ">=4.5.2" + } }, "node_modules/@typescript/lib-es5": { - "resolved": "../dist-package/es5", - "link": true + "name": "@better-typescript-lib/es5", + "version": "2.2.0", + "resolved": "file:../dist-package/es5", + "license": "Apache-2.0", + "peerDependencies": { + "typescript": ">=4.5.2" + } }, "node_modules/@typescript/lib-esnext": { - "resolved": "../dist-package/esnext", - "link": true + "name": "@better-typescript-lib/esnext", + "version": "2.2.0", + "resolved": "file:../dist-package/esnext", + "license": "Apache-2.0", + "peerDependencies": { + "typescript": ">=4.5.2" + } }, "node_modules/@typescript/lib-header": { - "resolved": "../dist-package/header", - "link": true + "name": "@better-typescript-lib/header", + "version": "2.2.0", + "resolved": "file:../dist-package/header", + "license": "Apache-2.0", + "peerDependencies": { + "typescript": ">=4.5.2" + } }, "node_modules/@typescript/lib-scripthost": { - "resolved": "../dist-package/scripthost", - "link": true + "name": "@better-typescript-lib/scripthost", + "version": "2.2.0", + "resolved": "file:../dist-package/scripthost", + "license": "Apache-2.0", + "peerDependencies": { + "typescript": ">=4.5.2" + } }, "node_modules/@typescript/lib-webworker": { - "resolved": "../dist-package/webworker", - "link": true + "name": "@better-typescript-lib/webworker", + "version": "2.2.0", + "resolved": "file:../dist-package/webworker", + "license": "Apache-2.0", + "peerDependencies": { + "typescript": ">=4.5.2" + } }, "node_modules/ansi-escapes": { "version": "4.3.2", @@ -1458,7 +1415,6 @@ "version": "4.6.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz", "integrity": "sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==", - "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -1645,59 +1601,59 @@ "dev": true }, "@typescript/lib-dom": { - "version": "file:../dist-package/dom", + "version": "npm:@better-typescript-lib/dom@2.2.0", "requires": {} }, "@typescript/lib-es2015": { - "version": "file:../dist-package/es2015", + "version": "npm:@better-typescript-lib/es2015@2.2.0", "requires": {} }, "@typescript/lib-es2016": { - "version": "file:../dist-package/es2016", + "version": "npm:@better-typescript-lib/es2016@2.2.0", "requires": {} }, "@typescript/lib-es2017": { - "version": "file:../dist-package/es2017", + "version": "npm:@better-typescript-lib/es2017@2.2.0", "requires": {} }, "@typescript/lib-es2018": { - "version": "file:../dist-package/es2018", + "version": "npm:@better-typescript-lib/es2018@2.2.0", "requires": {} }, "@typescript/lib-es2019": { - "version": "file:../dist-package/es2019", + "version": "npm:@better-typescript-lib/es2019@2.2.0", "requires": {} }, "@typescript/lib-es2020": { - "version": "file:../dist-package/es2020", + "version": "npm:@better-typescript-lib/es2020@2.2.0", "requires": {} }, "@typescript/lib-es2021": { - "version": "file:../dist-package/es2021", + "version": "npm:@better-typescript-lib/es2021@2.2.0", "requires": {} }, "@typescript/lib-es2022": { - "version": "file:../dist-package/es2022", + "version": "npm:@better-typescript-lib/es2022@2.2.0", "requires": {} }, "@typescript/lib-es5": { - "version": "file:../dist-package/es5", + "version": "npm:@better-typescript-lib/es5@2.2.0", "requires": {} }, "@typescript/lib-esnext": { - "version": "file:../dist-package/esnext", + "version": "npm:@better-typescript-lib/esnext@2.2.0", "requires": {} }, "@typescript/lib-header": { - "version": "file:../dist-package/header", + "version": "npm:@better-typescript-lib/header@2.2.0", "requires": {} }, "@typescript/lib-scripthost": { - "version": "file:../dist-package/scripthost", + "version": "npm:@better-typescript-lib/scripthost@2.2.0", "requires": {} }, "@typescript/lib-webworker": { - "version": "file:../dist-package/webworker", + "version": "npm:@better-typescript-lib/webworker@2.2.0", "requires": {} }, "ansi-escapes": { @@ -2478,8 +2434,7 @@ "typescript": { "version": "4.6.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz", - "integrity": "sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==", - "dev": true + "integrity": "sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==" }, "validate-npm-package-license": { "version": "3.0.4", diff --git a/tests/src/es2016.array.include.ts b/tests/src/es2016.array.include.ts new file mode 100644 index 0000000..2cc8811 --- /dev/null +++ b/tests/src/es2016.array.include.ts @@ -0,0 +1,43 @@ +import { expectType } from "tsd"; + +{ + // Array + const arr1 = [1, 2, 3]; + let x1: unknown; + if (arr1.includes(x1)) { + expectType(x1); + } + + const arr2 = [1, 2, 3]; + const x2 = "str"; + if (arr2.includes(x2)) { + expectType(x2); + } + + const arr3 = [1, true, "str"]; + let x3: unknown; + if (arr3.includes(x3)) { + expectType(x3); + } +} + +{ + // ReadonlyArray + const arr1 = [1, 2, 3] as const; + let x1: unknown; + if (arr1.includes(x1)) { + expectType<1 | 2 | 3>(x1); + } + + const arr2 = [1, 2, 3, "string"] as const; + const x2 = "str"; + if (arr2.includes(x2)) { + expectType(x2); + } + + const arr3 = [1, true, "str"] as const; + let x3: unknown; + if (arr3.includes(x3)) { + expectType<1 | true | "str">(x3); + } +}