Skip to content

Added type guard overload ReadonlyArray.prototype.every #18372

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/lib/es5.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1014,6 +1014,7 @@ interface ReadonlyArray<T> {
* @param callbackfn A function that accepts up to three arguments. The every method calls the callbackfn function for each element in array1 until the callbackfn returns false, or until the end of the array.
* @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.
*/
every<U extends T>(callbackfn: (value: T, index: number, array: ReadonlyArray<T>) => value is U, thisArg?: any): this is ReadonlyArray<U>;
every(callbackfn: (value: T, index: number, array: ReadonlyArray<T>) => boolean, thisArg?: any): boolean;
/**
* Determines whether the specified callback function returns true for any element of an array.
Expand Down
35 changes: 35 additions & 0 deletions tests/baselines/reference/arrayEvery.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
//// [arrayEvery.ts]
declare const baseReadonlyArray: ReadonlyArray<number | string>;
const isNumber = (x: any): x is number => "number" === typeof x;

if (baseReadonlyArray.every<number>((x): x is number => "number" === typeof x)) {
const numberReadonlyArray: ReadonlyArray<number> = baseReadonlyArray; // should be ReadonlyArray<number>
}
if (baseReadonlyArray.every<number>(isNumber)) {
const numberReadonlyArray: ReadonlyArray<number> = baseReadonlyArray; // should be ReadonlyArray<number>
}

if (baseReadonlyArray.every((x: any): x is number => "number" === typeof x)) {
const numberReadonlyArray: ReadonlyArray<number> = baseReadonlyArray; // should be ReadonlyArray<number>
}
if (baseReadonlyArray.every(isNumber)) {
const numberReadonlyArray: ReadonlyArray<number> = baseReadonlyArray; // should be ReadonlyArray<number>
}

baseReadonlyArray.every(x => "number" === typeof x && x > 2);

//// [arrayEvery.js]
var isNumber = function (x) { return "number" === typeof x; };
if (baseReadonlyArray.every(function (x) { return "number" === typeof x; })) {
var numberReadonlyArray = baseReadonlyArray; // should be ReadonlyArray<number>
}
if (baseReadonlyArray.every(isNumber)) {
var numberReadonlyArray = baseReadonlyArray; // should be ReadonlyArray<number>
}
if (baseReadonlyArray.every(function (x) { return "number" === typeof x; })) {
var numberReadonlyArray = baseReadonlyArray; // should be ReadonlyArray<number>
}
if (baseReadonlyArray.every(isNumber)) {
var numberReadonlyArray = baseReadonlyArray; // should be ReadonlyArray<number>
}
baseReadonlyArray.every(function (x) { return "number" === typeof x && x > 2; });
69 changes: 69 additions & 0 deletions tests/baselines/reference/arrayEvery.symbols
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
=== tests/cases/compiler/arrayEvery.ts ===
declare const baseReadonlyArray: ReadonlyArray<number | string>;
>baseReadonlyArray : Symbol(baseReadonlyArray, Decl(arrayEvery.ts, 0, 13))
>ReadonlyArray : Symbol(ReadonlyArray, Decl(lib.d.ts, --, --))

const isNumber = (x: any): x is number => "number" === typeof x;
>isNumber : Symbol(isNumber, Decl(arrayEvery.ts, 1, 5))
>x : Symbol(x, Decl(arrayEvery.ts, 1, 18))
>x : Symbol(x, Decl(arrayEvery.ts, 1, 18))
>x : Symbol(x, Decl(arrayEvery.ts, 1, 18))

if (baseReadonlyArray.every<number>((x): x is number => "number" === typeof x)) {
>baseReadonlyArray.every : Symbol(ReadonlyArray.every, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
>baseReadonlyArray : Symbol(baseReadonlyArray, Decl(arrayEvery.ts, 0, 13))
>every : Symbol(ReadonlyArray.every, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
>x : Symbol(x, Decl(arrayEvery.ts, 3, 37))
>x : Symbol(x, Decl(arrayEvery.ts, 3, 37))
>x : Symbol(x, Decl(arrayEvery.ts, 3, 37))

const numberReadonlyArray: ReadonlyArray<number> = baseReadonlyArray; // should be ReadonlyArray<number>
>numberReadonlyArray : Symbol(numberReadonlyArray, Decl(arrayEvery.ts, 4, 7))
>ReadonlyArray : Symbol(ReadonlyArray, Decl(lib.d.ts, --, --))
>baseReadonlyArray : Symbol(baseReadonlyArray, Decl(arrayEvery.ts, 0, 13))
}
if (baseReadonlyArray.every<number>(isNumber)) {
>baseReadonlyArray.every : Symbol(ReadonlyArray.every, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
>baseReadonlyArray : Symbol(baseReadonlyArray, Decl(arrayEvery.ts, 0, 13))
>every : Symbol(ReadonlyArray.every, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
>isNumber : Symbol(isNumber, Decl(arrayEvery.ts, 1, 5))

const numberReadonlyArray: ReadonlyArray<number> = baseReadonlyArray; // should be ReadonlyArray<number>
>numberReadonlyArray : Symbol(numberReadonlyArray, Decl(arrayEvery.ts, 7, 7))
>ReadonlyArray : Symbol(ReadonlyArray, Decl(lib.d.ts, --, --))
>baseReadonlyArray : Symbol(baseReadonlyArray, Decl(arrayEvery.ts, 0, 13))
}

if (baseReadonlyArray.every((x: any): x is number => "number" === typeof x)) {
>baseReadonlyArray.every : Symbol(ReadonlyArray.every, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
>baseReadonlyArray : Symbol(baseReadonlyArray, Decl(arrayEvery.ts, 0, 13))
>every : Symbol(ReadonlyArray.every, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
>x : Symbol(x, Decl(arrayEvery.ts, 10, 29))
>x : Symbol(x, Decl(arrayEvery.ts, 10, 29))
>x : Symbol(x, Decl(arrayEvery.ts, 10, 29))

const numberReadonlyArray: ReadonlyArray<number> = baseReadonlyArray; // should be ReadonlyArray<number>
>numberReadonlyArray : Symbol(numberReadonlyArray, Decl(arrayEvery.ts, 11, 7))
>ReadonlyArray : Symbol(ReadonlyArray, Decl(lib.d.ts, --, --))
>baseReadonlyArray : Symbol(baseReadonlyArray, Decl(arrayEvery.ts, 0, 13))
}
if (baseReadonlyArray.every(isNumber)) {
>baseReadonlyArray.every : Symbol(ReadonlyArray.every, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
>baseReadonlyArray : Symbol(baseReadonlyArray, Decl(arrayEvery.ts, 0, 13))
>every : Symbol(ReadonlyArray.every, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
>isNumber : Symbol(isNumber, Decl(arrayEvery.ts, 1, 5))

const numberReadonlyArray: ReadonlyArray<number> = baseReadonlyArray; // should be ReadonlyArray<number>
>numberReadonlyArray : Symbol(numberReadonlyArray, Decl(arrayEvery.ts, 14, 7))
>ReadonlyArray : Symbol(ReadonlyArray, Decl(lib.d.ts, --, --))
>baseReadonlyArray : Symbol(baseReadonlyArray, Decl(arrayEvery.ts, 0, 13))
}

baseReadonlyArray.every(x => "number" === typeof x && x > 2);
>baseReadonlyArray.every : Symbol(ReadonlyArray.every, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
>baseReadonlyArray : Symbol(baseReadonlyArray, Decl(arrayEvery.ts, 0, 13))
>every : Symbol(ReadonlyArray.every, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
>x : Symbol(x, Decl(arrayEvery.ts, 17, 24))
>x : Symbol(x, Decl(arrayEvery.ts, 17, 24))
>x : Symbol(x, Decl(arrayEvery.ts, 17, 24))

93 changes: 93 additions & 0 deletions tests/baselines/reference/arrayEvery.types
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
=== tests/cases/compiler/arrayEvery.ts ===
declare const baseReadonlyArray: ReadonlyArray<number | string>;
>baseReadonlyArray : ReadonlyArray<string | number>
>ReadonlyArray : ReadonlyArray<T>

const isNumber = (x: any): x is number => "number" === typeof x;
>isNumber : (x: any) => x is number
>(x: any): x is number => "number" === typeof x : (x: any) => x is number
>x : any
>x : any
>"number" === typeof x : boolean
>"number" : "number"
>typeof x : "string" | "number" | "boolean" | "symbol" | "undefined" | "object" | "function"
>x : any

if (baseReadonlyArray.every<number>((x): x is number => "number" === typeof x)) {
>baseReadonlyArray.every<number>((x): x is number => "number" === typeof x) : boolean
>baseReadonlyArray.every : { <U extends string | number>(callbackfn: (value: string | number, index: number, array: ReadonlyArray<string | number>) => value is U, thisArg?: any): this is ReadonlyArray<U>; (callbackfn: (value: string | number, index: number, array: ReadonlyArray<string | number>) => boolean, thisArg?: any): boolean; }
>baseReadonlyArray : ReadonlyArray<string | number>
>every : { <U extends string | number>(callbackfn: (value: string | number, index: number, array: ReadonlyArray<string | number>) => value is U, thisArg?: any): this is ReadonlyArray<U>; (callbackfn: (value: string | number, index: number, array: ReadonlyArray<string | number>) => boolean, thisArg?: any): boolean; }
>(x): x is number => "number" === typeof x : (x: string | number) => x is number
>x : string | number
>x : any
>"number" === typeof x : boolean
>"number" : "number"
>typeof x : "string" | "number" | "boolean" | "symbol" | "undefined" | "object" | "function"
>x : string | number

const numberReadonlyArray: ReadonlyArray<number> = baseReadonlyArray; // should be ReadonlyArray<number>
>numberReadonlyArray : ReadonlyArray<number>
>ReadonlyArray : ReadonlyArray<T>
>baseReadonlyArray : ReadonlyArray<number>
}
if (baseReadonlyArray.every<number>(isNumber)) {
>baseReadonlyArray.every<number>(isNumber) : boolean
>baseReadonlyArray.every : { <U extends string | number>(callbackfn: (value: string | number, index: number, array: ReadonlyArray<string | number>) => value is U, thisArg?: any): this is ReadonlyArray<U>; (callbackfn: (value: string | number, index: number, array: ReadonlyArray<string | number>) => boolean, thisArg?: any): boolean; }
>baseReadonlyArray : ReadonlyArray<string | number>
>every : { <U extends string | number>(callbackfn: (value: string | number, index: number, array: ReadonlyArray<string | number>) => value is U, thisArg?: any): this is ReadonlyArray<U>; (callbackfn: (value: string | number, index: number, array: ReadonlyArray<string | number>) => boolean, thisArg?: any): boolean; }
>isNumber : (x: any) => x is number

const numberReadonlyArray: ReadonlyArray<number> = baseReadonlyArray; // should be ReadonlyArray<number>
>numberReadonlyArray : ReadonlyArray<number>
>ReadonlyArray : ReadonlyArray<T>
>baseReadonlyArray : ReadonlyArray<number>
}

if (baseReadonlyArray.every((x: any): x is number => "number" === typeof x)) {
>baseReadonlyArray.every((x: any): x is number => "number" === typeof x) : boolean
>baseReadonlyArray.every : { <U extends string | number>(callbackfn: (value: string | number, index: number, array: ReadonlyArray<string | number>) => value is U, thisArg?: any): this is ReadonlyArray<U>; (callbackfn: (value: string | number, index: number, array: ReadonlyArray<string | number>) => boolean, thisArg?: any): boolean; }
>baseReadonlyArray : ReadonlyArray<string | number>
>every : { <U extends string | number>(callbackfn: (value: string | number, index: number, array: ReadonlyArray<string | number>) => value is U, thisArg?: any): this is ReadonlyArray<U>; (callbackfn: (value: string | number, index: number, array: ReadonlyArray<string | number>) => boolean, thisArg?: any): boolean; }
>(x: any): x is number => "number" === typeof x : (x: any) => x is number
>x : any
>x : any
>"number" === typeof x : boolean
>"number" : "number"
>typeof x : "string" | "number" | "boolean" | "symbol" | "undefined" | "object" | "function"
>x : any

const numberReadonlyArray: ReadonlyArray<number> = baseReadonlyArray; // should be ReadonlyArray<number>
>numberReadonlyArray : ReadonlyArray<number>
>ReadonlyArray : ReadonlyArray<T>
>baseReadonlyArray : ReadonlyArray<number>
}
if (baseReadonlyArray.every(isNumber)) {
>baseReadonlyArray.every(isNumber) : boolean
>baseReadonlyArray.every : { <U extends string | number>(callbackfn: (value: string | number, index: number, array: ReadonlyArray<string | number>) => value is U, thisArg?: any): this is ReadonlyArray<U>; (callbackfn: (value: string | number, index: number, array: ReadonlyArray<string | number>) => boolean, thisArg?: any): boolean; }
>baseReadonlyArray : ReadonlyArray<string | number>
>every : { <U extends string | number>(callbackfn: (value: string | number, index: number, array: ReadonlyArray<string | number>) => value is U, thisArg?: any): this is ReadonlyArray<U>; (callbackfn: (value: string | number, index: number, array: ReadonlyArray<string | number>) => boolean, thisArg?: any): boolean; }
>isNumber : (x: any) => x is number

const numberReadonlyArray: ReadonlyArray<number> = baseReadonlyArray; // should be ReadonlyArray<number>
>numberReadonlyArray : ReadonlyArray<number>
>ReadonlyArray : ReadonlyArray<T>
>baseReadonlyArray : ReadonlyArray<number>
}

baseReadonlyArray.every(x => "number" === typeof x && x > 2);
>baseReadonlyArray.every(x => "number" === typeof x && x > 2) : boolean
>baseReadonlyArray.every : { <U extends string | number>(callbackfn: (value: string | number, index: number, array: ReadonlyArray<string | number>) => value is U, thisArg?: any): this is ReadonlyArray<U>; (callbackfn: (value: string | number, index: number, array: ReadonlyArray<string | number>) => boolean, thisArg?: any): boolean; }
>baseReadonlyArray : ReadonlyArray<string | number>
>every : { <U extends string | number>(callbackfn: (value: string | number, index: number, array: ReadonlyArray<string | number>) => value is U, thisArg?: any): this is ReadonlyArray<U>; (callbackfn: (value: string | number, index: number, array: ReadonlyArray<string | number>) => boolean, thisArg?: any): boolean; }
>x => "number" === typeof x && x > 2 : (x: string | number) => boolean
>x : string | number
>"number" === typeof x && x > 2 : boolean
>"number" === typeof x : boolean
>"number" : "number"
>typeof x : "string" | "number" | "boolean" | "symbol" | "undefined" | "object" | "function"
>x : string | number
>x > 2 : boolean
>x : number
>2 : 2

18 changes: 18 additions & 0 deletions tests/cases/compiler/arrayEvery.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
declare const baseReadonlyArray: ReadonlyArray<number | string>;
const isNumber = (x: any): x is number => "number" === typeof x;

if (baseReadonlyArray.every<number>((x): x is number => "number" === typeof x)) {
const numberReadonlyArray: ReadonlyArray<number> = baseReadonlyArray; // should be ReadonlyArray<number>
}
if (baseReadonlyArray.every<number>(isNumber)) {
const numberReadonlyArray: ReadonlyArray<number> = baseReadonlyArray; // should be ReadonlyArray<number>
}

if (baseReadonlyArray.every((x: any): x is number => "number" === typeof x)) {
const numberReadonlyArray: ReadonlyArray<number> = baseReadonlyArray; // should be ReadonlyArray<number>
}
if (baseReadonlyArray.every(isNumber)) {
const numberReadonlyArray: ReadonlyArray<number> = baseReadonlyArray; // should be ReadonlyArray<number>
}

baseReadonlyArray.every(x => "number" === typeof x && x > 2);