8000 Covariant value types in collections. (#1087) · githubsheng/immutable-js@3f2e682 · GitHub
[go: up one dir, main page]

Skip to content

Commit 3f2e682

Browse files
authored
Covariant value types in collections. (immutable-js#1087)
Fixes immutable-js#1052
1 parent ba53544 commit 3f2e682

File tree

3 files changed

+99
-38
lines changed

3 files changed

+99
-38
lines changed

dist/immutable.js.flow

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
*/
3030
type ESIterable<T> = $Iterable<T,void,void>;
3131

32-
declare class _Iterable<K, V, KI, II, SI> {
32+
declare class _Iterable<K, +V, KI, II, SI> {
3333
static Keyed: KI;
3434
static Indexed: II;
3535
static Set: SI;
@@ -184,9 +184,9 @@ declare class _Iterable<K, V, KI, II, SI> {
184184
isSuperset(iter: ESIterable<V>): boolean;
185185
}
186186

187-
declare class Iterable<K, V> extends _Iterable<K, V, typeof KeyedIterable, typeof IndexedIterable, typeof SetIterable> {}
187+
declare class Iterable<K, +V> extends _Iterable<K, V, typeof KeyedIterable, typeof IndexedIterable, typeof SetIterable> {}
188188

189-
declare class KeyedIterable<K,V> extends Iterable<K,V> {
189+
declare class KeyedIterable<K, +V> extends Iterable<K,V> {
190190
static <K,V>(iter?: ESIterable<[K,V]>): KeyedIterable<K,V>;
191191
static <K,V>(obj?: { [key: K]: V }): KeyedIterable<K,V>;
192192

@@ -222,7 +222,7 @@ declare class KeyedIterable<K,V> extends Iterable<K,V> {
222222

223223
Iterable.Keyed = KeyedIterable
224224

225-
declare class IndexedIterable<T> extends Iterable<number,T> {
225+
declare class IndexedIterable<+T> extends Iterable<number,T> {
226226
static <T>(iter?: ESIterable<T>): IndexedIterable<T>;
227227

228228
@@iterator(): Iterator<T>;
@@ -330,7 +330,7 @@ declare class IndexedIterable<T> extends Iterable<number,T> {
330330
flatten(shallow?: boolean): /*this*/IndexedIterable<any>;
331331
}
332332

333-
declare class SetIterable<T> extends Iterable<T,T> {
333+
declare class SetIterable<+T> extends Iterable<T,T> {
334334
static <T>(iter?: ESIterable<T>): SetIterable<T>;
335335

336336
@@iterator(): Iterator<T>;
@@ -356,23 +356,23 @@ declare class SetIterable<T> extends Iterable<T,T> {
356356
flatten(shallow?: boolean): /*this*/SetIterable<any>;
357357
}
358358

359-
declare class Collection<K,V> extends _Iterable<K,V, typeof KeyedCollection, typeof IndexedCollection, typeof SetCollection> {
359+
declare class Collection<K, +V> extends _Iterable<K,V, typeof KeyedCollection, typeof IndexedCollection, typeof SetCollection> {
360360
size: number;
361361
}
362362

363-
declare class KeyedCollection<K,V> extends Collection<K,V> mixins KeyedIterable<K,V> {
363+
declare class KeyedCollection<K, +V> extends Collection<K,V> mixins KeyedIterable<K,V> {
364364
toSeq(): KeyedSeq<K,V>;
365365
}
366366

367-
declare class IndexedCollection<T> extends Collection<number,T> mixins IndexedIterable<T> {
367+
declare class IndexedCollection<+T> extends Collection<number,T> mixins IndexedIterable<T> {
368368
toSeq(): IndexedSeq<T>;
369369
}
370370

371-
declare class SetCollection<T> extends Collection<T,T> mixins SetIterable<T> {
371+
declare class SetCollection<+T> extends Collection<T,T> mixins SetIterable<T> {
372372
toSeq(): SetSeq<T>;
373373
}
374374

375-
declare class Seq<K,V> extends _Iterable<K,V, typeof KeyedSeq, typeof IndexedSeq, typeof SetSeq> {
375+
declare class Seq<K, +V> extends _Iterable<K,V, typeof KeyedSeq, typeof IndexedSeq, typeof SetSeq> {
376376
static <K,V>(iter: KeyedSeq<K,V>): KeyedSeq<K,V>;
377377
static <T> (iter: SetSeq<T>): SetSeq<K,V>;
378378
static <T> (iter?: ESIterable<T>): IndexedSeq<T>;
@@ -386,22 +386,22 @@ declare class Seq<K,V> extends _Iterable<K,V, typeof KeyedSeq, typeof IndexedSeq
386386
toSeq(): this;
387387
}
388388

389-
declare class KeyedSeq<K,V> extends Seq<K,V> mixins KeyedIterable<K,V> {
389+
declare class KeyedSeq<K, +V> extends Seq<K,V> mixins KeyedIterable<K,V> {
390390
static <K,V>(iter?: ESIterable<[K,V]>): KeyedSeq<K,V>;
391391
static <K,V>(iter?: { [key: K]: V }): KeyedSeq<K,V>;
392392
}
393393

394-
declare class IndexedSeq<T> extends Seq<number,T> mixins IndexedIterable<T> {
394+
declare class IndexedSeq<+T> extends Seq<number,T> mixins IndexedIterable<T> {
395395
static <T>(iter?: ESIterable<T>): IndexedSeq<T>;
396396
static of<T>(...values: T[]): IndexedSeq<T>;
397397
}
398398

399-
declare class SetSeq<T> extends Seq<T,T> mixins SetIterable<T> {
399+
declare class SetSeq<+T> extends Seq<T,T> mixins SetIterable<T> {
400400
static <T>(iter?: ESIterable<T>): IndexedSeq<T>;
401401
static of<T>(...values: T[]): SetSeq<T>;
402402
}
403403

404-
declare class List<T> extends IndexedCollection<T> {
404+
declare class List<+T> extends IndexedCollection<T> {
405405
static (iterable?: ESIterable<T>): List<T>;
406406

407407
static isList(maybeList: any): boolean;
@@ -465,7 +465,7 @@ declare class List<T> extends IndexedCollection<T> {
465465
flatten(shallow?: boolean): /*this*/List<any>;
466466
}
467467

468-
declare class Map<K,V> extends KeyedCollection<K,V> {
468+
declare class Map<K, +V> extends KeyedCollection<K,V> {
469469
static <K, V>(obj?: {[key: K]: V}): Map<K, V>;
470470
static <K, V>(iterable: ESIterable<[K,V]>): Map<K, V>;
471471

@@ -550,7 +550,7 @@ declare class Map<K,V> extends KeyedCollection<K,V> {
550550
flatten(shallow?: boolean): /*this*/Map<any,any>;
551551
}
552552

553-
declare class OrderedMap<K,V> extends KeyedCollection<K,V> {
553+
declare class OrderedMap<K, +V> extends KeyedCollection<K,V> {
554554
static <K, V>(obj?: {[key: K]: V}): OrderedMap<K, V>;
555555
static <K, V>(iterable: ESIterable<[K,V]>): OrderedMap<K, V>;
556556
static isOrderedMap(maybeOrderedMap: any): bool;
@@ -631,7 +631,7 @@ declare class OrderedMap<K,V> extends KeyedCollection<K,V> {
631631
flatten(shallow?: boolean): /*this*/OrderedMap<any,any>
632632
}
633633

634-
declare class Set<T> extends SetCollection<T> {
634+
declare class Set<+T> extends SetCollection<T> {
635635
static <T>(iterable: ESIterable<T>): Set<T>;
636636
static isSet(maybeSet: any): boolean;
637637
static of<T>(...values: T[]): Set<T>;
@@ -668,7 +668,7 @@ declare class Set<T> extends SetCollection<T> {
668668
}
669669

670670
// Overrides except for `isOrderedSet` are for specialized return types
671-
declare class OrderedSet<T> extends Set<T> {
671+
declare class OrderedSet<+T> extends Set<T> {
672672
static <T>(iterable: ESIterable<T>): OrderedSet<T>;
673673
static of<T>(...values: T[]): OrderedSet<T>;
674674
static fromKeys<T>(iter: ESIterable<[T,any]>): OrderedSet<T>;
@@ -696,7 +696,7 @@ declare class OrderedSet<T> extends Set<T> {
696696
flatten(shallow?: boolean): /*this*/OrderedSet<any>;
697697
}
698698

699-
declare class Stack<T> extends IndexedCollection<T> {
699+
declare class Stack<+T> extends IndexedCollection<T> {
700700
static <T>(iterable?: ESIterable<T>): Stack<T>;
701701

702702
static isStack(maybeStack: any): boolean;

type-definitions/immutable.js.flow

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
*/
3030
type ESIterable<T> = $Iterable<T,void,void>;
3131

32-
declare class _Iterable<K, V, KI, II, SI> {
32+
declare class _Iterable<K, +V, KI, II, SI> {
3333
static Keyed: KI;
3434
static Indexed: II;
3535
static Set: SI;
@@ -184,9 +184,9 @@ declare class _Iterable<K, V, KI, II, SI> {
184184
isSuperset(iter: ESIterable<V>): boolean;
185185
}
186186

187-
declare class Iterable<K, V> extends _Iterable<K, V, typeof KeyedIterable, typeof IndexedIterable, typeof SetIterable> {}
187+
declare class Iterable<K, +V> extends _Iterable<K, V, typeof KeyedIterable, typeof IndexedIterable, typeof SetIterable> {}
188188

189-
declare class KeyedIterable<K,V> extends Iterable<K,V> {
189+
declare class KeyedItera 10000 ble<K, +V> extends Iterable<K,V> {
190190
static <K,V>(iter?: ESIterable<[K,V]>): KeyedIterable<K,V>;
191191
static <K,V>(obj?: { [key: K]: V }): KeyedIterable<K,V>;
192192

@@ -222,7 +222,7 @@ declare class KeyedIterable<K,V> extends Iterable<K,V> {
222222

223223
Iterable.Keyed = KeyedIterable
224224

225-
declare class IndexedIterable<T> extends Iterable<number,T> {
225+
declare class IndexedIterable<+T> extends Iterable<number,T> {
226226
static <T>(iter?: ESIterable<T>): IndexedIterable<T>;
227227

228228
@@iterator(): Iterator<T>;
@@ -330,7 +330,7 @@ declare class IndexedIterable<T> extends Iterable<number,T> {
330330
flatten(shallow?: boolean): /*this*/IndexedIterable<any>;
331331
}
332332

333-
declare class SetIterable<T> extends Iterable<T,T> {
333+
declare class SetIterable<+T> extends Iterable<T,T> {
334334
static <T>(iter?: ESIterable<T>): SetIterable<T>;
335335

336336
@@iterator(): Iterator<T>;
@@ -356,23 +356,23 @@ declare class SetIterable<T> extends Iterable<T,T> {
356356
flatten(shallow?: boolean): /*this*/SetIterable<any>;
357357
}
358358

359-
declare class Collection<K,V> extends _Iterable<K,V, typeof KeyedCollection, typeof IndexedCollection, typeof SetCollection> {
359+
declare class Collection<K, +V> extends _Iterable<K,V, typeof KeyedCollection, typeof IndexedCollection, typeof SetCollection> {
360360
size: number;
361361
}
362362

363-
declare class KeyedCollection<K,V> extends Collection<K,V> mixins KeyedIterable<K,V> {
363+
declare class KeyedCollection<K, +V> extends Collection<K,V> mixins KeyedIterable<K,V> {
364364
toSeq(): KeyedSeq<K,V>;
365365
}
366366

367-
declare class IndexedCollection<T> extends Collection<number,T> mixins IndexedIterable<T> {
367+
declare class IndexedCollection<+T> extends Collection<number,T> mixins IndexedIterable<T> {
368368
toSeq(): IndexedSeq<T>;
369369
}
370370

371-
declare class SetCollection<T> extends Collection<T,T> mixins SetIterable<T> {
371+
declare class SetCollection<+T> extends Collection<T,T> mixins SetIterable<T> {
372372
toSeq(): SetSeq<T>;
373373
}
374374

375-
declare class Seq<K,V> extends _Iterable<K,V, typeof KeyedSeq, typeof IndexedSeq, typeof SetSeq> {
375+
declare class Seq<K, +V> extends _Iterable<K,V, typeof KeyedSeq, typeof IndexedSeq, typeof SetSeq> {
376376
static <K,V>(iter: KeyedSeq<K,V>): KeyedSeq<K,V>;
377377
static <T> (iter: SetSeq<T>): SetSeq<K,V>;
378378
static <T> (iter?: ESIterable<T>): IndexedSeq<T>;
@@ -386,22 +386,22 @@ declare class Seq<K,V> extends _Iterable<K,V, typeof KeyedSeq, typeof IndexedSeq
386386
toSeq(): this;
387387
}
388388

389-
declare class KeyedSeq<K,V> extends Seq<K,V> mixins KeyedIterable<K,V> {
389+
declare class KeyedSeq<K, +V> extends Seq<K,V> mixins KeyedIterable<K,V> {
390390
static <K,V>(iter?: ESIterable<[K,V]>): KeyedSeq<K,V>;
391391
static <K,V>(iter?: { [key: K]: V }): KeyedSeq<K,V>;
392392
}
393393

394-
declare class IndexedSeq<T> extends Seq<number,T> mixins IndexedIterable<T> {
394+
declare class IndexedSeq<+T> extends Seq<number,T> mixins IndexedIterable<T> {
395395
static <T>(iter?: ESIterable<T>): IndexedSeq<T>;
396396
static of<T>(...values: T[]): IndexedSeq<T>;
397397
}
398398

399-
declare class SetSeq<T> extends Seq<T,T> mixins SetIterable<T> {
399+
declare class SetSeq<+T> extends Seq<T,T> mixins SetIterable<T> {
400400
static <T>(iter?: ESIterable<T>): IndexedSeq<T>;
401401
static of<T>(...values: T[]): SetSeq<T>;
402402
}
403403

404-
declare class List<T> extends IndexedCollection<T> {
404+
declare class List<+T> extends IndexedCollection<T> {
405405
static (iterable?: ESIterable<T>): List<T>;
406406

407407
static isList(maybeList: any): boolean;
@@ -465,7 +465,7 @@ declare class List<T> extends IndexedCollection<T> {
465465
flatten(shallow?: boolean): /*this*/List<any>;
466466
}
467467

468-
declare class Map<K,V> extends KeyedCollection<K,V> {
468+
declare class Map<K, +V> extends KeyedCollection<K,V> {
469469
static <K, V>(obj?: {[key: K]: V}): Map<K, V>;
470470
static <K, V>(iterable: ESIterable<[K,V]>): Map<K, V>;
471471

@@ -550,7 +550,7 @@ declare class Map<K,V> extends KeyedCollection<K,V> {
550550
flatten(shallow?: boolean): /*this*/Map<any,any>;
551551
}
552552

553-
declare class OrderedMap<K,V> extends KeyedCollection<K,V> {
553+
declare class OrderedMap<K, +V> extends KeyedCollection<K,V> {
554554
static <K, V>(obj?: {[key: K]: V}): OrderedMap<K, V>;
555555
static <K, V>(iterable: ESIterable<[K,V]>): OrderedMap<K, V>;
556556
static isOrderedMap(maybeOrderedMap: any): bool;
@@ -631,7 +631,7 @@ declare class OrderedMap<K,V> extends KeyedCollection<K,V> {
631631
flatten(shallow?: boolean): /*this*/OrderedMap<any,any>
632632
}
633633

634-
declare class Set<T> extends SetCollection<T> {
634+
declare class Set<+T> extends SetCollection<T> {
635635
static <T>(iterable: ESIterable<T>): Set<T>;
636636
static isSet(maybeSet: any): boolean;
637637
static of<T>(...values: T[]): Set<T>;
@@ -668,7 +668,7 @@ declare class Set<T> extends SetCollection<T> {
668668
}
669669

670670
// Overrides except for `isOrderedSet` are for specialized return types
671-
declare class OrderedSet<T> extends Set<T> {
671+
declare class OrderedSet<+T> extends Set<T> {
672672
static <T>(iterable: ESIterable<T>): OrderedSet<T>;
673673
static of<T>(...values: T[]): OrderedSet<T>;
674674
static fromKeys<T>(iter: ESIterable<[T,any]>): OrderedSet<T>;
@@ -696,7 +696,7 @@ declare class OrderedSet<T> extends Set<T> {
696696
flatten(shallow?: boolean): /*this*/OrderedSet<any>;
697697
}
698698

699-
declare class Stack<T> extends IndexedCollection<T> {
699+
declare class Stack<+T> extends IndexedCollection<T> {
700700
static <T>(iterable?: ESIterable<T>): Stack<T>;
701701

702702
static isStack(maybeStack: any): boolean;

type-definitions/tests/covariance.js

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
/*
2+
* @flow
3+
*/
4+
5+
// Some tests look like they are repeated in order to avoid false positives.
6+
// Flow might not complain about an instance of (what it thinks is) T to be assigned to T<K, V>
7+
8+
import {
9+
List,
10+
Map,
11+
Set,
12+
Stack,
13+
OrderedMap,
14+
OrderedSet,
15+
} from '../../';
16+
17+
class A { x: number; }
18+
class B extends A { y: string; }
19+
class C { z: string; }
20+
21+
// List covariance
22+
declare var listOfB: List<B>;
23+
var listOfA: List<A> = listOfB;
24+
listOfA = List([new B()]);
25+
// $ExpectError
26+
var listOfC: List<C> = listOfB;
27+
28+
// Map covariance
29+
declare var mapOfB: Map<string, B>;
30+
var mapOfA: Map<string, A> = mapOfB;
31+
mapOfA = Map({b: new B()});
32+
// $ExpectError
33+
var mapOfC: Map<string, C> = mapOfB;
34+
35+
// Set covariance
36+
declare var setOfB: Set<B>;
37+
var setOfA: Set<A> = setOfB;
38+
setOfA = Set([new B()]);
39+
// $ExpectError
40+
var setOfC: Set<C> = setOfB;
41+
42+
// Stack covariance
43+
declare var stackOfB: Stack<B>;
44+
var stackOfA: Stack<A> = stackOfB;
45+
stackOfA = Stack([new B()]);
46+
// $ExpectError
47+
var stackOfC: Stack<C> = stackOfB;
48+
49+
// OrderedMap covariance
50+
declare var orderedMapOfB: OrderedMap<string, B>;
51+
var orderedMapOfA: OrderedMap<string, A> = orderedMapOfB;
52+
orderedMapOfA = OrderedMap({b: new B()});
53+
// $ExpectError
54+
var orderedMapOfC: OrderedMap<string, C> = orderedMapOfB;
55+
56+
// OrderedSet covariance
57+
declare var orderedSetOfB: OrderedSet<B>;
58+
var orderedSetOfA: OrderedSet<A> = orderedSetOfB;
59+
orderedSetOfA = OrderedSet([new B()]);
60+
// $ExpectError
61+
var orderedSetOfC: OrderedSet<C> = orderedSetOfB;

0 commit comments

Comments
 (0)
0