Skip to content

Commit

Permalink
add types for set methods proposal
Browse files Browse the repository at this point in the history
  • Loading branch information
bakkot committed Jan 30, 2024
1 parent 3251a12 commit b1ea83a
Show file tree
Hide file tree
Showing 6 changed files with 854 additions and 0 deletions.
46 changes: 46 additions & 0 deletions src/lib/esnext.collection.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,49 @@ interface MapConstructor {
keySelector: (item: T, index: number) => K,
): Map<K, T[]>;
}

interface SetLike<T> {
/**
* Despite its name, returns an iterable of the values in the set-like.
*/
keys(): Iterable<T>;
/**
* @returns a boolean indicating whether an element with the specified value exists in the set-like or not.
*/
has(value: T): boolean;
/**
* @returns the number of (unique) elements in the set-like.
*/
readonly size: number;
}

interface Set<T> {
/**
* @returns a new Set containing all the elements in this Set and also all the elements in the argument.
*/
union(other: SetLike<T>): Set<T>;
/**
* @returns a new Set containing all the elements which are both in this Set and in the argument.
*/
intersection(other: SetLike<T>): Set<T>;
/**
* @returns a new Set containing all the elements in this Set which are not also in the argument.
*/
difference(other: SetLike<T>): Set<T>;
/**
* @returns a new Set containing all the elements in this Set which are in this or in the argument, but not in both.
*/
symmetricDifference(other: SetLike<T>): Set<T>;
/**
* @returns a boolean indicating whether all the elements in this Set are also in the argument.
*/
isSubsetOf(other: SetLike<T>): Set<T>;
/**
* @returns a boolean indicating whether all the elements in the argument are also in this Set.
*/
isSupersetOf(other: SetLike<T>): Set<T>;
/**
* @returns a boolean indicating whether this Set has no elements in common with the argument.
*/
isDisjointFrom(other: SetLike<T>): Set<T>;
}
111 changes: 111 additions & 0 deletions tests/baselines/reference/setMethods.errors.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
setMethods.ts(13,17): error TS2345: Argument of type 'undefined[]' is not assignable to parameter of type 'SetLike<number>'.
Type 'undefined[]' is missing the following properties from type 'SetLike<number>': has, size
setMethods.ts(15,17): error TS2345: Argument of type 'Set<string>' is not assignable to parameter of type 'SetLike<number>'.
The types returned by 'keys()[Symbol.iterator]().next(...)' are incompatible between these types.
Type 'IteratorResult<string, any>' is not assignable to type 'IteratorResult<number, any>'.
Type 'IteratorYieldResult<string>' is not assignable to type 'IteratorResult<number, any>'.
Type 'IteratorYieldResult<string>' is not assignable to type 'IteratorYieldResult<number>'.
Type 'string' is not assignable to type 'number'.
setMethods.ts(19,24): error TS2345: Argument of type 'undefined[]' is not assignable to parameter of type 'SetLike<number>'.
setMethods.ts(21,24): error TS2345: Argument of type 'Set<string>' is not assignable to parameter of type 'SetLike<number>'.
setMethods.ts(25,22): error TS2345: Argument of type 'undefined[]' is not assignable to parameter of type 'SetLike<number>'.
setMethods.ts(27,22): error TS2345: Argument of type 'Set<string>' is not assignable to parameter of type 'SetLike<number>'.
setMethods.ts(31,31): error TS2345: Argument of type 'undefined[]' is not assignable to parameter of type 'SetLike<number>'.
setMethods.ts(33,31): error TS2345: Argument of type 'Set<string>' is not assignable to parameter of type 'SetLike<number>'.
setMethods.ts(37,22): error TS2345: Argument of type 'undefined[]' is not assignable to parameter of type 'SetLike<number>'.
setMethods.ts(39,22): error TS2345: Argument of type 'Set<string>' is not assignable to parameter of type 'SetLike<number>'.
setMethods.ts(43,24): error TS2345: Argument of type 'undefined[]' is not assignable to parameter of type 'SetLike<number>'.
setMethods.ts(45,24): error TS2345: Argument of type 'Set<string>' is not assignable to parameter of type 'SetLike<number>'.
setMethods.ts(49,26): error TS2345: Argument of type 'undefined[]' is not assignable to parameter of type 'SetLike<number>'.
setMethods.ts(51,26): error TS2345: Argument of type 'Set<string>' is not assignable to parameter of type 'SetLike<number>'.


==== setMethods.ts (14 errors) ====
let numberSet = new Set([0, 1, 2]);

let stringSet = new Set(["a", "b"]);

let numberMap = new Map([[4, {}], [5, {}]]);

let numberSetLike = {
size: 1,
*keys() { yield 3 },
has(x) { return x === 3 },
};

numberSet.union([]);
~~
!!! error TS2345: Argument of type 'undefined[]' is not assignable to parameter of type 'SetLike<number>'.
!!! error TS2345: Type 'undefined[]' is missing the following properties from type 'SetLike<number>': has, size
numberSet.union(new Set);
numberSet.union(stringSet);
~~~~~~~~~
!!! error TS2345: Argument of type 'Set<string>' is not assignable to parameter of type 'SetLike<number>'.
!!! error TS2345: The types returned by 'keys()[Symbol.iterator]().next(...)' are incompatible between these types.
!!! error TS2345: Type 'IteratorResult<string, any>' is not assignable to type 'IteratorResult<number, any>'.
!!! error TS2345: Type 'IteratorYieldResult<string>' is not assignable to type 'IteratorResult<number, any>'.
!!! error TS2345: Type 'IteratorYieldResult<string>' is not assignable to type 'IteratorYieldResult<number>'.
!!! error TS2345: Type 'string' is not assignable to type 'number'.
numberSet.union(numberMap);
numberSet.union(numberSetLike);

numberSet.intersection([]);
~~
!!! error TS2345: Argument of type 'undefined[]' is not assignable to parameter of type 'SetLike<number>'.
numberSet.intersection(new Set);
numberSet.intersection(stringSet);
~~~~~~~~~
!!! error TS2345: Argument of type 'Set<string>' is not assignable to parameter of type 'SetLike<number>'.
numberSet.intersection(numberMap);
numberSet.intersection(numberSetLike);

numberSet.difference([]);
~~
!!! error TS2345: Argument of type 'undefined[]' is not assignable to parameter of type 'SetLike<number>'.
numberSet.difference(new Set);
numberSet.difference(stringSet);
~~~~~~~~~
!!! error TS2345: Argument of type 'Set<string>' is not assignable to parameter of type 'SetLike<number>'.
numberSet.difference(numberMap);
numberSet.difference(numberSetLike);

numberSet.symmetricDifference([]);
~~
!!! error TS2345: Argument of type 'undefined[]' is not assignable to parameter of type 'SetLike<number>'.
numberSet.symmetricDifference(new Set);
numberSet.symmetricDifference(stringSet);
~~~~~~~~~
!!! error TS2345: Argument of type 'Set<string>' is not assignable to parameter of type 'SetLike<number>'.
numberSet.symmetricDifference(numberMap);
numberSet.symmetricDifference(numberSetLike);

numberSet.isSubsetOf([]);
~~
!!! error TS2345: Argument of type 'undefined[]' is not assignable to parameter of type 'SetLike<number>'.
numberSet.isSubsetOf(new Set);
numberSet.isSubsetOf(stringSet);
~~~~~~~~~
!!! error TS2345: Argument of type 'Set<string>' is not assignable to parameter of type 'SetLike<number>'.
numberSet.isSubsetOf(numberMap);
numberSet.isSubsetOf(numberSetLike);

numberSet.isSupersetOf([]);
~~
!!! error TS2345: Argument of type 'undefined[]' is not assignable to parameter of type 'SetLike<number>'.
numberSet.isSupersetOf(new Set);
numberSet.isSupersetOf(stringSet);
~~~~~~~~~
!!! error TS2345: Argument of type 'Set<string>' is not assignable to parameter of type 'SetLike<number>'.
numberSet.isSupersetOf(numberMap);
numberSet.isSupersetOf(numberSetLike);

numberSet.isDisjointFrom([]);
~~
!!! error TS2345: Argument of type 'undefined[]' is not assignable to parameter of type 'SetLike<number>'.
numberSet.isDisjointFrom(new Set);
numberSet.isDisjointFrom(stringSet);
~~~~~~~~~
!!! error TS2345: Argument of type 'Set<string>' is not assignable to parameter of type 'SetLike<number>'.
numberSet.isDisjointFrom(numberMap);
numberSet.isDisjointFrom(numberSetLike);

102 changes: 102 additions & 0 deletions tests/baselines/reference/setMethods.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
//// [tests/cases/compiler/setMethods.ts] ////

//// [setMethods.ts]
let numberSet = new Set([0, 1, 2]);

let stringSet = new Set(["a", "b"]);

let numberMap = new Map([[4, {}], [5, {}]]);

let numberSetLike = {
size: 1,
*keys() { yield 3 },
has(x) { return x === 3 },
};

numberSet.union([]);
numberSet.union(new Set);
numberSet.union(stringSet);
numberSet.union(numberMap);
numberSet.union(numberSetLike);

numberSet.intersection([]);
numberSet.intersection(new Set);
numberSet.intersection(stringSet);
numberSet.intersection(numberMap);
numberSet.intersection(numberSetLike);

numberSet.difference([]);
numberSet.difference(new Set);
numberSet.difference(stringSet);
numberSet.difference(numberMap);
numberSet.difference(numberSetLike);

numberSet.symmetricDifference([]);
numberSet.symmetricDifference(new Set);
numberSet.symmetricDifference(stringSet);
numberSet.symmetricDifference(numberMap);
numberSet.symmetricDifference(numberSetLike);

numberSet.isSubsetOf([]);
numberSet.isSubsetOf(new Set);
numberSet.isSubsetOf(stringSet);
numberSet.isSubsetOf(numberMap);
numberSet.isSubsetOf(numberSetLike);

numberSet.isSupersetOf([]);
numberSet.isSupersetOf(new Set);
numberSet.isSupersetOf(stringSet);
numberSet.isSupersetOf(numberMap);
numberSet.isSupersetOf(numberSetLike);

numberSet.isDisjointFrom([]);
numberSet.isDisjointFrom(new Set);
numberSet.isDisjointFrom(stringSet);
numberSet.isDisjointFrom(numberMap);
numberSet.isDisjointFrom(numberSetLike);


//// [setMethods.js]
let numberSet = new Set([0, 1, 2]);
let stringSet = new Set(["a", "b"]);
let numberMap = new Map([[4, {}], [5, {}]]);
let numberSetLike = {
size: 1,
*keys() { yield 3; },
has(x) { return x === 3; },
};
numberSet.union([]);
numberSet.union(new Set);
numberSet.union(stringSet);
numberSet.union(numberMap);
numberSet.union(numberSetLike);
numberSet.intersection([]);
numberSet.intersection(new Set);
numberSet.intersection(stringSet);
numberSet.intersection(numberMap);
numberSet.intersection(numberSetLike);
numberSet.difference([]);
numberSet.difference(new Set);
numberSet.difference(stringSet);
numberSet.difference(numberMap);
numberSet.difference(numberSetLike);
numberSet.symmetricDifference([]);
numberSet.symmetricDifference(new Set);
numberSet.symmetricDifference(stringSet);
numberSet.symmetricDifference(numberMap);
numberSet.symmetricDifference(numberSetLike);
numberSet.isSubsetOf([]);
numberSet.isSubsetOf(new Set);
numberSet.isSubsetOf(stringSet);
numberSet.isSubsetOf(numberMap);
numberSet.isSubsetOf(numberSetLike);
numberSet.isSupersetOf([]);
numberSet.isSupersetOf(new Set);
numberSet.isSupersetOf(stringSet);
numberSet.isSupersetOf(numberMap);
numberSet.isSupersetOf(numberSetLike);
numberSet.isDisjointFrom([]);
numberSet.isDisjointFrom(new Set);
numberSet.isDisjointFrom(stringSet);
numberSet.isDisjointFrom(numberMap);
numberSet.isDisjointFrom(numberSetLike);
Loading

0 comments on commit b1ea83a

Please sign in to comment.