8000 Flow type: Add special case for `.filter(Boolean)` to remove nulls. (… · lisongyu/immutable-js@d5c0b0e · GitHub
[go: up one dir, main page]

Skip to content

Commit d5c0b0e

Browse files
authored
Flow type: Add special case for .filter(Boolean) to remove nulls. (immutable-js#1352)
Fixes immutable-js#1200
1 parent 7015a48 commit d5c0b0e

File tree

2 files changed

+85
-9
lines changed

2 files changed

+85
-9
lines changed

type-definitions/immutable.js.flow

Lines changed: 76 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -101,11 +101,6 @@ declare class _Collection<K, +V> /*implements ValueObject*/ {
101101
takeWhile(predicate: (value: V, key: K, iter: this) => mixed, context?: mixed): this;
102102
takeUntil(predicate: (value: V, key: K, iter: this) => mixed, context?: mixed): this;
103103

104-
filter(
105-
predicate: (value: V, key: K, iter: this) => mixed,
106-
context?: mixed
107-
): this;
108-
109104
filterNot(
110105
predicate: (value: V, key: K, iter: this) => mixed,
111106
context?: mixed
@@ -217,6 +212,12 @@ declare class KeyedCollection<K, +V> extends Collection<K, V> {
217212
concat<KC, VC>(...iters: Array<Iterable<[KC, VC]>>): KeyedCollection<K | KC, V | VC>;
218213
concat<KC, VC>(...iters: Array<PlainObjInput<KC, VC>>): KeyedCollection<K | KC, V | VC>;
219214

215+
filter(predicate: typeof Boolean): KeyedCollection<K, $NonMaybeType<V>>;
216+
filter(
217+
predicate: (value: V, key: K, iter: this) => mixed,
218+
context?: mixed
219+
): KeyedCollection<K, V>;
220+
220221
map<M>(
221222
mapper: (value: V, key: K, iter: this) => M,
222223
context?: mixed
@@ -371,6 +372,12 @@ declare class IndexedCollection<+T> extends Collection<number, T> {
371372

372373
concat<C>(...iters: Array<Iterable<C> | C>): IndexedCollection<T | C>;
373374

375+
filter(predicate: typeof Boolean): IndexedCollection<$NonMaybeType<T>>;
376+
filter(
377+
predicate: (value: T, index: number, iter: this) => mixed,
378+
context?: mixed
379+
): IndexedCollection<T>;
380+
374381
map<M>(
375382
mapper: (value: T, index: number, iter: this) => M,
376383
context?: mixed
@@ -396,10 +403,16 @@ declare class SetCollection<+T> extends Collection<T, T> {
396403

397404
concat<C>(...iters: Array<Iterable<C> | C>): SetCollection<T | C>;
398405

399-
// `map` and `flatMap` cannot be defined further up the hierarchy, because the
400-
// implementation for `KeyedCollection` allows the value type to change without
401-
// constraining the key type. That does not work for `SetCollection` - the value
402-
// and key types *must* match.
406+
// `filter`, `map` and `flatMap` cannot be defined further up the hierarchy,
407+
// because the implementation for `KeyedCollection` allows the value type to
408+
// change without constraining the key type. That does not work for
409+
// `SetCollection` - the value and key types *must* match.
410+
filter(predicate: typeof Boolean): SetCollection<$NonMaybeType<T>>;
411+
filter(
412+
predicate: (value: T, value: T, iter: this) => mixed,
413+
context?: mixed
414+
): SetCollection<T>;
415+
403416
map<M>(
404417
mapper: (value: T, value: T, iter: this) => M,
405418
context?: mixed
@@ -442,6 +455,12 @@ declare class KeyedSeq<K, +V> extends Seq<K, V> mixins KeyedCollection<K, V> {
442455
concat<KC, VC>(...iters: Array<Iterable<[KC, VC]>>): KeyedSeq<K | KC, V | VC>;
443456
concat<KC, VC>(...iters: Array<PlainObjInput<KC, VC>>): KeyedSeq<K | KC, V | VC>;
444457

458+
filter(predicate: typeof Boolean): KeyedSeq<K, $NonMaybeType<V>>;
459+
filter(
460+
predicate: (value: V, key: K, iter: this) => mixed,
461+
context?: mixed
462+
): KeyedSeq<K, V>;
463+
445464
map<M>(
446465
mapper: (value: V, key: K, iter: this) => M,
447466
context?: mixed
@@ -475,6 +494,12 @@ declare class IndexedSeq<+T> extends Seq<number, T> mixins IndexedCollection<T>
475494

476495
concat<C>(...iters: Array<Iterable<C> | C>): IndexedSeq<T | C>;
477496

497+
filter(predicate: typeof Boolean): IndexedSeq<$NonMaybeType<T>>;
498+
filter(
499+
predicate: (value: T, index: number, iter: this) => mixed,
500+
context?: mixed
501+
): IndexedSeq<T>;
502+
478503
map<M>(
479504
mapper: (value: T, index: number, iter: this) => M,
480505
context?: mixed
@@ -596,6 +621,12 @@ declare class SetSeq<+T> extends Seq<T, T> mixins SetCollection<T> {
596621

597622
concat<C>(...iters: Array<Iterable<C> | C>): SetSeq<T | C>;
598623

624+
filter(predicate: typeof Boolean): SetSeq<$NonMaybeType<T>>;
625+
filter(
626+
predicate: (value: T, value: T, iter: this) => mixed,
627+
context?: mixed
628+
): SetSeq<T>;
629+
599630
map<M>(
600631
mapper: (value: T, value: T, iter: this) => M,
601632
context?: mixed
@@ -663,6 +694,12 @@ declare class List<+T> extends IndexedCollection<T> {
663694

664695
concat<C>(...iters: Array<Iterable<C> | C>): List<T | C>;
665696

697+
filter(predicate: typeof Boolean): List<$NonMaybeType<T>>;
698+
filter(
699+
predicate: (value: T, index: number, iter: this) => mixed,
700+
context?: mixed
701+
): List<T>;
702+
666703
map<M>(
667704
mapper: (value: T, index: number, iter: this) => M,
668705
context?: mixed
@@ -849,6 +886,12 @@ declare class Map<K, +V> extends KeyedCollection<K, V> {
849886
concat<KC, VC>(...iters: Array<Iterable<[KC, VC]>>): Map<K | KC, V | VC>;
850887
concat<KC, VC>(...iters: Array<PlainObjInput<KC, VC>>): Map<K | KC, V | VC>;
851888

889+
filter(predicate: typeof Boolean): Map<K, $NonMaybeType<V>>;
890+
filter(
891+
predicate: (value: V, key: K, iter: this) => mixed,
892+
context?: mixed
893+
): Map<K, V>;
894+
852895
map<M>(
853896
mapper: (value: V, key: K, iter: this) => M,
854897
context?: mixed
@@ -944,6 +987,12 @@ declare class OrderedMap<K, +V> extends Map<K, V> {
944987
concat<KC, VC>(...iters: Array<Iterable<[KC, VC]>>): OrderedMap<K | KC, V | VC>;
945988
concat<KC, VC>(...iters: Array<PlainObjInput<KC, VC>>): OrderedMap<K | KC, V | VC>;
946989

990+
filter(predicate: typeof Boolean): OrderedMap<K, $NonMaybeType<V>>;
991+
filter(
992+
predicate: (value: V, key: K, iter: this) => mixed,
993+
context?: mixed
994+
): OrderedMap<K, V>;
995+
947996
map<M>(
948997
mapper: (value: V, key: K, iter: this) => M,
949998
context?: mixed
@@ -1001,6 +1050,12 @@ declare class Set<+T> extends SetCollection<T> {
10011050

10021051
concat<C>(...iters: Array<Iterable<C> | C>): Set<T | C>;
10031052

1053+
filter(predicate: typeof Boolean): Set<$NonMaybeType<T>>;
1054+
filter(
1055+
predicate: (value: T, value: T, iter: this) => mixed,
1056+
context?: mixed
1057+
): Set<T>;
1058+
10041059
map<M>(
10051060
mapper: (value: T, value: T, iter: this) => M,
10061061
context?: mixed
@@ -1036,6 +1091,12 @@ declare class OrderedSet<+T> extends Set<T> {
10361091

10371092
concat<C>(...iters: Array<Iterable<C> | C>): OrderedSet<T | C>;
10381093

1094+
filter(predicate: typeof Boolean): OrderedSet<$NonMaybeType<T>>;
1095+
filter(
1096+
predicate: (value: T, value: T, iter: this) => mixed,
1097+
context?: mixed
1098+
): OrderedSet<T>;
1099+
10391100
map<M>(
10401101
mapper: (value: T, value: T, iter: this) => M,
10411102
context?: mixed
@@ -1177,6 +1238,12 @@ declare class Stack<+T> extends IndexedCollection<T> {
11771238

11781239
concat<C>(...iters: Array<Iterable<C> | C>): Stack<T | C>;
11791240

1241+
filter(predicate: typeof Boolean): Stack<$NonMaybeType<T>>;
1242+
filter(
1243+
predicate: (value: T, index: number, iter: this) => mixed,
1244+
context?: mixed
1245+
): Stack<T>;
1246+
11801247
map<M>(
11811248
mapper: (value: T, index: number, iter: this) => M,
11821249
context?: mixed

type-definitions/tests/immutable-flow.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,9 @@ numberList = List.of(1).flatMap((value, index, iter) => ['a'])
196196

197197
numberList = List.of(1).flatten()
198198

199+
// Specific type for filter(Boolean) which removes nullability.
200+
numberList = nullableNumberList.filter(Boolean)
201+
199202
/* Map */
200203

201204
stringToNumber = Map()
@@ -333,6 +336,12 @@ stringToNumber = Map({'a': 1}).mapKeys((key, value, iter) => 1)
333336

334337
anyMap = Map({'a': 1}).flatten()
335338

339+
var stringToNullableNumber = Map({'a': 1, 'b': null});
340+
// $ExpectError
341< 5800 code class="diff-text syntax-highlighted-line addition">+
stringToNumber = stringToNullableNumber;
342+
// Specific type for filter(Boolean) which removes nullability.
343+
stringToNumber = stringToNullableNumber.filter(Boolean)
344+
336345
/* OrderedMap */
337346

338347
orderedStringToNumber = Map({'a': 1}).toOrderedMap()

0 commit comments

Comments
 (0)
0