diff options
author | Asher Gomez <ashersaupingomez@gmail.com> | 2023-11-02 10:18:41 +1100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-11-01 23:18:41 +0000 |
commit | d7348c870acb0dc7a9edeb0a865f5f09dcf64f38 (patch) | |
tree | 98820251a4643a95e8598a76223c528a1ad409f4 | |
parent | 58d543a480463ed24de77ec155f1d7e87bb7b234 (diff) |
fix: add missing `Object.groupBy()` and `Map.groupBy()` types (#21050)
-rw-r--r-- | cli/build.rs | 1 | ||||
-rw-r--r-- | cli/tests/unit/globals_test.ts | 47 | ||||
-rw-r--r-- | cli/tsc/dts/lib.esnext.d.ts | 1 | ||||
-rw-r--r-- | cli/tsc/dts/lib.esnext.object.d.ts | 32 |
4 files changed, 81 insertions, 0 deletions
diff --git a/cli/build.rs b/cli/build.rs index b7a452465..16b31081e 100644 --- a/cli/build.rs +++ b/cli/build.rs @@ -251,6 +251,7 @@ mod ts { "esnext.decorators", "esnext.disposable", "esnext.intl", + "esnext.object", ]; let path_dts = cwd.join("tsc/dts"); diff --git a/cli/tests/unit/globals_test.ts b/cli/tests/unit/globals_test.ts index b47e83cfd..9f7f77644 100644 --- a/cli/tests/unit/globals_test.ts +++ b/cli/tests/unit/globals_test.ts @@ -170,3 +170,50 @@ Deno.test(async function arrayFromAsync() { const b = await Array.fromAsync(new Map([[1, 2], [3, 4]])); assertEquals(b, [[1, 2], [3, 4]]); }); + +// Taken from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/groupBy#examples +Deno.test(function objectGroupBy() { + const inventory = [ + { name: "asparagus", type: "vegetables", quantity: 5 }, + { name: "bananas", type: "fruit", quantity: 0 }, + { name: "goat", type: "meat", quantity: 23 }, + { name: "cherries", type: "fruit", quantity: 5 }, + { name: "fish", type: "meat", quantity: 22 }, + ]; + const result = Object.groupBy(inventory, ({ type }) => type); + assertEquals(result, { + vegetables: [ + { name: "asparagus", type: "vegetables", quantity: 5 }, + ], + fruit: [ + { name: "bananas", type: "fruit", quantity: 0 }, + { name: "cherries", type: "fruit", quantity: 5 }, + ], + meat: [ + { name: "goat", type: "meat", quantity: 23 }, + { name: "fish", type: "meat", quantity: 22 }, + ], + }); +}); + +// Taken from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/groupBy#examples +Deno.test(function mapGroupBy() { + const inventory = [ + { name: "asparagus", type: "vegetables", quantity: 9 }, + { name: "bananas", type: "fruit", quantity: 5 }, + { name: "goat", type: "meat", quantity: 23 }, + { name: "cherries", type: "fruit", quantity: 12 }, + { name: "fish", type: "meat", quantity: 22 }, + ]; + const restock = { restock: true }; + const sufficient = { restock: false }; + const result = Map.groupBy( + inventory, + ({ quantity }) => quantity < 6 ? restock : sufficient, + ); + assertEquals(result.get(restock), [{ + name: "bananas", + type: "fruit", + quantity: 5, + }]); +}); diff --git a/cli/tsc/dts/lib.esnext.d.ts b/cli/tsc/dts/lib.esnext.d.ts index 3df5bce09..0f265acfa 100644 --- a/cli/tsc/dts/lib.esnext.d.ts +++ b/cli/tsc/dts/lib.esnext.d.ts @@ -19,5 +19,6 @@ and limitations under the License. /// <reference lib="es2023" /> /// <reference lib="esnext.array" /> /// <reference lib="esnext.intl" /> +/// <reference lib="esnext.object" /> /// <reference lib="esnext.decorators" /> /// <reference lib="esnext.disposable" /> diff --git a/cli/tsc/dts/lib.esnext.object.d.ts b/cli/tsc/dts/lib.esnext.object.d.ts new file mode 100644 index 000000000..130f2fc9f --- /dev/null +++ b/cli/tsc/dts/lib.esnext.object.d.ts @@ -0,0 +1,32 @@ +/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. All rights reserved. +Licensed under the Apache License, Version 2.0 (the "License"); you may not use +this file except in compliance with the License. You may obtain a copy of the +License at http://www.apache.org/licenses/LICENSE-2.0 + +THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED +WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, +MERCHANTABLITY OR NON-INFRINGEMENT. + +See the Apache Version 2.0 License for specific language governing permissions +and limitations under the License. +***************************************************************************** */ + +/// <reference no-default-lib="true"/> + +// NOTE(iuioiua): taken from https://github.com/microsoft/TypeScript/issues/47171#issuecomment-1697373352 +// while we wait for these types to officially ship +interface ObjectConstructor { + groupBy<Item, Key extends PropertyKey>( + items: Iterable<Item>, + keySelector: (item: Item, index: number) => Key, + ): Record<Key, Item[]>; +} + +interface MapConstructor { + groupBy<Item, Key>( + items: Iterable<Item>, + keySelector: (item: Item, index: number) => Key, + ): Map<Key, Item[]>; +} |