diff --git a/__tests__/groupBy.ts b/__tests__/groupBy.ts index 020a5d373a..bfaba132df 100644 --- a/__tests__/groupBy.ts +++ b/__tests__/groupBy.ts @@ -75,6 +75,13 @@ describe('groupBy', () => { expect(group.toJS()).toEqual({ odd: [1, 3, 5], even: [2, 4, 6] }); }); + it('allows `undefined` as a key', () => { + const group = Seq([1, 2, 3, 4, 5, 6]).groupBy((x) => + x % 2 ? undefined : 'even' + ); + expect(group.toJS()).toEqual({ undefined: [1, 3, 5], even: [2, 4, 6] }); + }); + it('groups indexed sequences, maintaining indicies when keyed sequences', () => { const group = Seq([1, 2, 3, 4, 5, 6]).groupBy((x) => x % 2); diff --git a/src/functional/get.ts b/src/functional/get.ts index 94171ccb55..e6306b8f58 100644 --- a/src/functional/get.ts +++ b/src/functional/get.ts @@ -49,12 +49,12 @@ export function get( key: string, notSetValue: NSV ): V | NSV; -export function get( +export function get( collection: Collection | Array | { [key: string]: V }, key: K, notSetValue?: NSV ): V | NSV; -export function get( +export function get( collection: Collection | Array | { [key: string]: V }, key: K, notSetValue?: NSV diff --git a/src/functional/remove.ts b/src/functional/remove.ts index a562864b82..60aff0fa36 100644 --- a/src/functional/remove.ts +++ b/src/functional/remove.ts @@ -39,13 +39,13 @@ export function remove< K extends keyof C, >(collection: C, key: K): C; export function remove< - K extends PropertyKey, + K, C extends | Collection | Array | { [key: PropertyKey]: unknown }, >(collection: C, key: K): C; -export function remove( +export function remove( collection: | Collection | Array @@ -67,6 +67,7 @@ export function remove( // @ts-expect-error weird "remove" here, return collection.remove(key); } + // @ts-expect-error assert that key is a string, a number or a symbol here if (!hasOwnProperty.call(collection, key)) { return collection; } @@ -75,6 +76,7 @@ export function remove( // @ts-expect-error assert that key is a number here collectionCopy.splice(key, 1); } else { + // @ts-expect-error assert that key is a string, a number or a symbol here delete collectionCopy[key]; } return collectionCopy; diff --git a/src/functional/updateIn.ts b/src/functional/updateIn.ts index eab7df0b00..99eed7980e 100644 --- a/src/functional/updateIn.ts +++ b/src/functional/updateIn.ts @@ -36,24 +36,19 @@ export type PossibleCollection = | Record | Array; -type UpdaterFunction = ( +type UpdaterFunction = ( value: RetrievePath> | undefined ) => unknown | undefined; -type UpdaterFunctionWithNSV = ( +type UpdaterFunctionWithNSV = ( value: RetrievePath> | NSV ) => unknown; -export function updateIn>( +export function updateIn>( collection: C, keyPath: KeyPath, updater: UpdaterFunction ): C; -export function updateIn< - K extends PropertyKey, - V, - C extends Collection, - NSV, ->( +export function updateIn, NSV>( collection: C, keyPath: KeyPath, notSetValue: NSV, @@ -75,43 +70,34 @@ export function updateIn< notSetValue: NSV, updater: UpdaterFunctionWithNSV ): C; -export function updateIn>( +export function updateIn>( collection: C, keyPath: KeyPath, updater: UpdaterFunction ): Array; -export function updateIn, NSV>( +export function updateIn, NSV>( collection: C, keyPath: KeyPath, notSetValue: NSV, updater: UpdaterFunctionWithNSV ): Array; -export function updateIn( +export function updateIn( object: C, keyPath: KeyPath, updater: UpdaterFunction ): C; -export function updateIn( +export function updateIn( object: C, keyPath: KeyPath, notSetValue: NSV, updater: UpdaterFunctionWithNSV ): C; -export function updateIn< - K extends PropertyKey, - V, - C extends { [key: PropertyKey]: V }, ->( +export function updateIn( collection: C, keyPath: KeyPath, updater: UpdaterFunction ): { [key: PropertyKey]: V }; -export function updateIn< - K extends PropertyKey, - V, - C extends { [key: PropertyKey]: V }, - NSV, ->( +export function updateIn( collection: C, keyPath: KeyPath, notSetValue: NSV, @@ -119,7 +105,7 @@ export function updateIn< ): { [key: PropertyKey]: V }; export function updateIn< - K extends PropertyKey, + K, V, TProps extends object, C extends PossibleCollection, @@ -150,7 +136,7 @@ export function updateIn< } function updateInDeeply< - K extends PropertyKey, + K, TProps extends object, C extends PossibleCollection, NSV, @@ -180,12 +166,6 @@ function updateInDeeply< } const key = keyPath[i]; - if (typeof key === 'undefined') { - throw new TypeError( - 'Index can not be undefined in updateIn(). This should not happen' - ); - } - const nextExisting = wasNotSet ? NOT_SET : get(existing, key, NOT_SET); const nextUpdated = updateInDeeply( nextExisting === NOT_SET ? inImmutable : isImmutable(nextExisting), @@ -196,6 +176,7 @@ function updateInDeeply< notSetValue, updater ); + return nextUpdated === nextExisting ? existing : nextUpdated === NOT_SET diff --git a/type-definitions/immutable.d.ts b/type-definitions/immutable.d.ts index 622fb01cfa..331dc2c6a8 100644 --- a/type-definitions/immutable.d.ts +++ b/type-definitions/immutable.d.ts @@ -949,7 +949,7 @@ declare namespace Immutable { never; /** @ignore */ - type RetrievePath> = P extends [] + type RetrievePath> = P extends [] ? P : RetrievePathReducer, Tail

>;