Merge pull request #16054 from c7hm4r/master

ES6-Shim: `Map.get()`, `Array.find()` and others may return `undefined`
This commit is contained in:
Ron Buckton
2017-06-01 12:34:17 -07:00
committed by GitHub
3 changed files with 53 additions and 42 deletions
+45 -33
View File
@@ -1,31 +1,37 @@
declare const require: (module: string) => Object;
if (require !== null) {
require('es6-shim');
}
interface Point { x: number; y: number; }
interface Point3D extends Point { z: number; }
let a: any;
let s: string;
let i: number;
let s: string = '';
let i: number = 2;
let iOrUndef: number | undefined;
let b: boolean;
let f: () => void;
let f: () => void = () => {};
let o: Object;
let r: RegExp;
let sym: symbol;
let e: Error;
let r: RegExp = /a/;
let sym: symbol = {} as symbol;
let e: Error = new Error();
let date: Date;
let key: PropertyKey;
let point: Point;
let point3d: Point3D;
let arrayOfPoint: Point[];
let point: Point = { x: 1, y: 2 };
let point3d: Point3D = { x: 1, y: 2, z: 3 };
let point3dOrUndef: Point3D | undefined;
let pointOrUndef: Point | undefined;
let arrayOfPoint: Point[] = [];
let arrayOfPoint3D: Point3D[];
let arrayOfSymbol: symbol[];
let arrayOfPropertyKey: PropertyKey[];
let arrayOfAny: any[];
let arrayOfStringAny: [string, any][];
let arrayLikeOfAny: ArrayLike<any>;
let iterableOfPoint: IterableShim<Point>;
let iterableOfStringPoint: IterableShim<[string, Point]>;
let iterableOfPointPoint3D: IterableShim<[Point, Point3D]>;
let arrayLikeOfAny: ArrayLike<any> = [];
let iterableOfPoint: IterableShim<Point> = [];
let iterableOfStringPoint: IterableShim<[string, Point]> = [];
let iterableOfPointPoint3D: IterableShim<[Point, Point3D]> = [];
let iterableIteratorOfPoint: IterableIteratorShim<Point>;
let iterableIteratorOfNumberPoint: IterableIteratorShim<[number, Point]>;
let iterableIteratorOfNumber: IterableIteratorShim<number>;
@@ -37,23 +43,23 @@ let iterableIteratorOfAny: IterableIteratorShim<any>;
let iterableIteratorOfPropertyKey: IterableIteratorShim<PropertyKey>;
let iterableIteratorOfPropertyKeyPoint: IterableIteratorShim<[PropertyKey, Point]>;
let nodeList: NodeList;
let pd: PropertyDescriptor;
let pdm: PropertyDescriptorMap;
let map: Map<string, Point>;
let set: Set<Point>;
let weakMap: WeakMap<Point, Point3D>;
let weakSet: WeakSet<Point>;
let promiseLikeOfPoint: PromiseLike<Point>;
let promiseLikeOfPoint3D: PromiseLike<Point3D>;
let promiseOfPoint: Promise<Point>;
let promiseOfPoint3D: Promise<Point3D>;
let pd: PropertyDescriptor = {};
let pdm: PropertyDescriptorMap = {};
let map: Map<string, Point> = new Map<string, Point>();
let set: Set<Point> = new Set<Point>();
let weakMap: WeakMap<Point, Point3D> = new WeakMap<Point, Point3D>();
let weakSet: WeakSet<Point> = new WeakSet<Point>();
let promiseLikeOfPoint: PromiseLike<Point> = Promise.resolve(point);
let promiseLikeOfPoint3D: PromiseLike<Point3D> = Promise.resolve(point3d);
let promiseOfPoint: Promise<Point> = Promise.resolve(point);
let promiseOfPoint3D: Promise<Point3D> = Promise.resolve(point);
let promiseOfArrayOfPoint: Promise<Point[]>;
let promiseOfVoid: Promise<void>;
point = Object.assign(point, point);
b = Object.is(point, point);
Object.setPrototypeOf(point, point);
point = arrayOfPoint.find(p => b);
Object.setPrototypeOf(point, {});
pointOrUndef = arrayOfPoint.find(p => b);
i = arrayOfPoint.findIndex(p => b);
arrayOfPoint = arrayOfPoint.fill(point, i, arrayOfPoint.length);
arrayOfPoint = arrayOfPoint.copyWithin(i, i, i);
@@ -69,7 +75,7 @@ b = s.includes(s, i);
b = s.endsWith(s, i);
s = s.repeat(i);
b = s.startsWith(s, i);
s = String.fromCodePoint(i, i);
s = String.fromCodePoint(2 as number, 3 as number);
s = String.raw`abc`;
s = r.flags;
i = Number.EPSILON;
@@ -102,7 +108,7 @@ i = Math.cbrt(i);
map.clear();
map.delete(s);
map.forEach((value: Point, key: string) => { });
point = map.get(s);
pointOrUndef = map.get(s);
b = map.has(s);
map = map.set(s, point);
i = map.size;
@@ -117,7 +123,7 @@ i = set.size;
set = new Set<Point>();
set = new Set(iterableOfPoint);
weakMap.delete(point);
point3d = weakMap.get(point);
point3dOrUndef = weakMap.get(point);
b = weakMap.has(point);
weakMap = weakMap.set(point, point3d);
weakMap = new WeakMap<Point, Point3D>();
@@ -184,6 +190,8 @@ promiseOfPoint = new Promise<Point>((resolve, reject) => resolve(point));
promiseOfPoint = new Promise<Point>((resolve, reject) => resolve(promiseOfPoint));
promiseOfPoint = new Promise<Point>((resolve, reject) => resolve(promiseLikeOfPoint));
promiseOfPoint = new Promise<Point>((resolve, reject) => reject(e));
// To prevent UnhandledPromiseRejectionWarning
promiseOfPoint.catch(() => {});
promiseOfArrayOfPoint = Promise.all(arrayOfPoint);
promiseOfArrayOfPoint = Promise.all(iterableOfPoint);
promiseOfPoint = Promise.race(arrayOfPoint);
@@ -193,7 +201,11 @@ promiseOfPoint = Promise.resolve(point3d);
promiseOfPoint = Promise.resolve(promiseOfPoint);
promiseOfPoint = Promise.resolve(promiseLikeOfPoint);
promiseOfVoid = Promise.reject(e);
// To prevent UnhandledPromiseRejectionWarning
promiseOfVoid.catch(() => {});
promiseOfPoint = Promise.reject<Point>(e);
// To prevent UnhandledPromiseRejectionWarning
promiseOfPoint.catch(() => {});
a = Reflect.apply(f, a, arrayLikeOfAny);
a = Reflect.construct(f, arrayLikeOfAny);
b = Reflect.defineProperty(a, s, pd);
@@ -203,9 +215,9 @@ b = Reflect.deleteProperty(a, s);
b = Reflect.deleteProperty(a, i);
b = Reflect.deleteProperty(a, sym);
iterableIteratorOfAny = Reflect.enumerate(a);
a = Reflect.get(a, s, a);
a = Reflect.get(a, i, a);
a = Reflect.get(a, sym, a);
Reflect.get(a, s, a);
Reflect.get(a, i, a);
Reflect.get(a, sym, a);
pd = Reflect.getOwnPropertyDescriptor(a, s);
pd = Reflect.getOwnPropertyDescriptor(a, i);
pd = Reflect.getOwnPropertyDescriptor(a, sym);
@@ -219,4 +231,4 @@ b = Reflect.preventExtensions(a);
b = Reflect.set(a, s, a, a);
b = Reflect.set(a, i, a, a);
b = Reflect.set(a, sym, a, a);
b = Reflect.setPrototypeOf(a, a);
b = Reflect.setPrototypeOf(a, a);
+6 -7
View File
@@ -185,11 +185,10 @@ interface Array<T> {
* @param thisArg If provided, it will be used as the this value for each invocation of
* predicate. If it is not provided, undefined is used instead.
*/
find(predicate: (value: T, index: number, obj: Array<T>) => boolean, thisArg?: any): T;
find(predicate: (value: T, index: number, obj: Array<T>) => boolean, thisArg?: any): T | undefined;
/**
* Returns the index of the first element in the array where predicate is true, and undefined
* otherwise.
* Returns the index of the first element in the array where predicate is true, and -1 otherwise.
* @param predicate find calls predicate once for each element of the array, in ascending
* order, until it finds one where predicate returns true. If such an element is found, find
* immediately returns that element value. Otherwise, find returns undefined.
@@ -556,9 +555,9 @@ interface Map<K, V> {
clear(): void;
delete(key: K): boolean;
forEach(callbackfn: (value: V, index: K, map: Map<K, V>) => void, thisArg?: any): void;
get(key: K): V;
get(key: K): V | undefined;
has(key: K): boolean;
set(key: K, value?: V): Map<K, V>;
set(key: K, value: V): Map<K, V>;
size: number;
entries(): IterableIteratorShim<[K, V]>;
keys(): IterableIteratorShim<K>;
@@ -596,9 +595,9 @@ declare var Set: SetConstructor;
interface WeakMap<K extends object, V> {
delete(key: K): boolean;
get(key: K): V;
get(key: K): V | undefined;
has(key: K): boolean;
set(key: K, value?: V): WeakMap<K, V>;
set(key: K, value: V): WeakMap<K, V>;
}
interface WeakMapConstructor {
+2 -2
View File
@@ -7,7 +7,7 @@
],
"noImplicitAny": true,
"noImplicitThis": true,
"strictNullChecks": false,
"strictNullChecks": true,
"baseUrl": "../",
"typeRoots": [
"../"
@@ -20,4 +20,4 @@
"index.d.ts",
"es6-shim-tests.ts"
]
}
}