From 08593e167ff9e1d786fd3da607b26298c9eb005f Mon Sep 17 00:00:00 2001 From: Julien Deniau Date: Tue, 6 Jul 2021 14:57:37 +0200 Subject: [PATCH 1/3] Fix type signature of update and mapEntries --- type-definitions/Immutable.d.ts | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/type-definitions/Immutable.d.ts b/type-definitions/Immutable.d.ts index 9efc21ed23..b043475d09 100644 --- a/type-definitions/Immutable.d.ts +++ b/type-definitions/Immutable.d.ts @@ -391,8 +391,8 @@ declare module Immutable { * * @see `Map#update` */ - update(index: number, notSetValue: T, updater: (value: T) => T): this; - update(index: number, updater: (value: T) => T): this; + update(index: number, notSetValue: T, updater: (value: T | undefined) => T): this; + update(index: number, updater: (value: T | undefined) => T): this; update(updater: (value: this) => R): R; /** @@ -1367,7 +1367,7 @@ declare module Immutable { * @see Collection.Keyed.mapEntries */ mapEntries( - mapper: (entry: [K, V], index: number, iter: this) => [KM, VM], + mapper: (entry: [K, V], index: number, iter: this) => [KM, VM] | undefined, context?: unknown ): Map; @@ -1538,7 +1538,7 @@ declare module Immutable { * @see Collection.Keyed.mapEntries */ mapEntries( - mapper: (entry: [K, V], index: number, iter: this) => [KM, VM], + mapper: (entry: [K, V], index: number, iter: this) => [KM, VM] | undefined, context?: unknown ): OrderedMap; @@ -2825,7 +2825,7 @@ declare module Immutable { * @see Collection.Keyed.mapEntries */ mapEntries( - mapper: (entry: [K, V], index: number, iter: this) => [KM, VM], + mapper: (entry: [K, V], index: number, iter: this) => [KM, VM] | undefined, context?: unknown ): Seq.Keyed; @@ -3431,9 +3431,11 @@ declare module Immutable { * * Note: `mapEntries()` always returns a new instance, even if it produced * the same entry at every step. + * + * If the mapper function returns `undefined`, then the entry will be filtered */ mapEntries( - mapper: (entry: [K, V], index: number, iter: this) => [KM, VM], + mapper: (entry: [K, V], index: number, iter: this) => [KM, VM] | undefined, context?: unknown ): Collection.Keyed; From d6e8204d627c2c7593a275d4ca679ccb2256d430 Mon Sep 17 00:00:00 2001 From: Julien Deniau Date: Thu, 8 Jul 2021 01:24:10 +0200 Subject: [PATCH 2/3] fix updater --- type-definitions/Immutable.d.ts | 12 ++++++++---- type-definitions/ts-tests/list.ts | 14 +++++++------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/type-definitions/Immutable.d.ts b/type-definitions/Immutable.d.ts index b043475d09..4781a8fa4b 100644 --- a/type-definitions/Immutable.d.ts +++ b/type-definitions/Immutable.d.ts @@ -391,7 +391,11 @@ declare module Immutable { * * @see `Map#update` */ - update(index: number, notSetValue: T, updater: (value: T | undefined) => T): this; + update( + index: number, + notSetValue: T, + updater: (value: T | undefined) => T + ): this; update(index: number, updater: (value: T | undefined) => T): this; update(updater: (value: this) => R): R; @@ -4755,7 +4759,7 @@ declare module Immutable { /** * Like `max`, but also accepts a `comparatorValueMapper` which allows for * comparing by more sophisticated means: - * + * * * ```js * const { List, } = require('immutable'); @@ -4792,7 +4796,7 @@ declare module Immutable { /** * Like `min`, but also accepts a `comparatorValueMapper` which allows for * comparing by more sophisticated means: - * + * * * ```js * const { List, } = require('immutable'); @@ -5334,7 +5338,7 @@ declare module Immutable { export function update>( collection: C, key: K, - updater: (value: V) => V + updater: (value: V | undefined) => V ): C; export function update, NSV>( collection: C, diff --git a/type-definitions/ts-tests/list.ts b/type-definitions/ts-tests/list.ts index 7b0d628daa..7b9599a327 100644 --- a/type-definitions/ts-tests/list.ts +++ b/type-definitions/ts-tests/list.ts @@ -248,25 +248,25 @@ import { List().update((v) => 1); // $ExpectError - List().update((v: List) => v); + List().update((v: List | undefined) => v); // $ExpectType List - List().update(0, (v: number) => 0); + List().update(0, (v: number | undefined) => 0); // $ExpectError - List().update(0, (v: number) => v + 'a'); + List().update(0, (v: number | undefined) => v + 'a'); // $ExpectType List - List().update(1, 10, (v: number) => 0); + List().update(1, 10, (v: number | undefined) => 0); // $ExpectError - List().update(1, 'a', (v: number) => 0); + List().update(1, 'a', (v: number | undefined) => 0); // $ExpectError - List().update(1, 10, (v: number) => v + 'a'); + List().update(1, 10, (v: number | undefined) => v + 'a'); // $ExpectType List - update(List(), 0, (v: number) => 0); + update(List(), 0, (v: number | undefined) => 0); // $ExpectError update(List(), 1, 10, (v: number) => v + 'a'); From 5c39949d080190aff9b1eb220428e60dacb842fc Mon Sep 17 00:00:00 2001 From: Julien Deniau Date: Thu, 8 Jul 2021 01:44:00 +0200 Subject: [PATCH 3/3] update might have an undefined parameter --- type-definitions/Immutable.d.ts | 8 ++------ type-definitions/ts-tests/map.ts | 12 ++++++------ type-definitions/ts-tests/ordered-map.ts | 12 ++++++------ 3 files changed, 14 insertions(+), 18 deletions(-) diff --git a/type-definitions/Immutable.d.ts b/type-definitions/Immutable.d.ts index 4781a8fa4b..6c5ab1cc22 100644 --- a/type-definitions/Immutable.d.ts +++ b/type-definitions/Immutable.d.ts @@ -391,11 +391,7 @@ declare module Immutable { * * @see `Map#update` */ - update( - index: number, - notSetValue: T, - updater: (value: T | undefined) => T - ): this; + update(index: number, notSetValue: T, updater: (value: T) => T): this; update(index: number, updater: (value: T | undefined) => T): this; update(updater: (value: this) => R): R; @@ -962,7 +958,7 @@ declare module Immutable { * Note: `update(key)` can be used in `withMutations`. */ update(key: K, notSetValue: V, updater: (value: V) => V): this; - update(key: K, updater: (value: V) => V): this; + update(key: K, updater: (value: V | undefined) => V): this; update(updater: (value: this) => R): R; /** diff --git a/type-definitions/ts-tests/map.ts b/type-definitions/ts-tests/map.ts index 0b6a69edb1..0c9fc7ce95 100644 --- a/type-definitions/ts-tests/map.ts +++ b/type-definitions/ts-tests/map.ts @@ -160,22 +160,22 @@ import { Map, List } from '../../'; Map().update((v) => 1); // $ExpectError - Map().update((v: Map) => v); + Map().update((v: Map | undefined) => v); // $ExpectType Map - Map().update(0, (v: number) => 0); + Map().update(0, (v: number | undefined) => 0); // $ExpectError - Map().update(0, (v: number) => v + 'a'); + Map().update(0, (v: number | undefined) => v + 'a'); // $ExpectType Map - Map().update(1, 10, (v: number) => 0); + Map().update(1, 10, (v: number | undefined) => 0); // $ExpectError - Map().update(1, 'a', (v: number) => 0); + Map().update(1, 'a', (v: number | undefined) => 0); // $ExpectError - Map().update(1, 10, (v: number) => v + 'a'); + Map().update(1, 10, (v: number | undefined) => v + 'a'); } { diff --git a/type-definitions/ts-tests/ordered-map.ts b/type-definitions/ts-tests/ordered-map.ts index d0564dffde..b5038942a0 100644 --- a/type-definitions/ts-tests/ordered-map.ts +++ b/type-definitions/ts-tests/ordered-map.ts @@ -145,22 +145,22 @@ import { OrderedMap, List } from '../../'; OrderedMap().update((v) => 1); // $ExpectError - OrderedMap().update((v: OrderedMap) => v); + OrderedMap().update((v: OrderedMap | undefined) => v); // $ExpectType OrderedMap - OrderedMap().update(0, (v: number) => 0); + OrderedMap().update(0, (v: number | undefined) => 0); // $ExpectError - OrderedMap().update(0, (v: number) => v + 'a'); + OrderedMap().update(0, (v: number | undefined) => v + 'a'); // $ExpectType OrderedMap - OrderedMap().update(1, 10, (v: number) => 0); + OrderedMap().update(1, 10, (v: number | undefined) => 0); // $ExpectError - OrderedMap().update(1, 'a', (v: number) => 0); + OrderedMap().update(1, 'a', (v: number | undefined) => 0); // $ExpectError - OrderedMap().update(1, 10, (v: number) => v + 'a'); + OrderedMap().update(1, 10, (v: number | undefined) => v + 'a'); } {