diff --git a/src/operator/filter.ts b/src/operator/filter.ts index 980a91b380..7a4958926c 100644 --- a/src/operator/filter.ts +++ b/src/operator/filter.ts @@ -50,6 +50,7 @@ export function filter(predicate: (value: T, index: number) => boolean, export interface FilterSignature { (predicate: (value: T, index: number) => boolean, thisArg?: any): Observable; + (predicate: (value: T, index: number) => value is S, thisArg?: any): Observable; } class FilterOperator implements Operator { diff --git a/src/operator/find.ts b/src/operator/find.ts index 5d475bb6d1..3d99ed59a4 100644 --- a/src/operator/find.ts +++ b/src/operator/find.ts @@ -45,6 +45,7 @@ export function find(predicate: (value: T, index: number, source: Observable< export interface FindSignature { (predicate: (value: T, index: number, source: Observable) => boolean, thisArg?: any): Observable; + (predicate: (value: T, index: number, source: Observable) => value is S, thisArg?: any): Observable; } export class FindValueOperator implements Operator { diff --git a/src/operator/first.ts b/src/operator/first.ts index f1cd6825c3..f07486e679 100644 --- a/src/operator/first.ts +++ b/src/operator/first.ts @@ -58,9 +58,15 @@ export function first(predicate?: (value: T, index: number, source: Observ return this.lift(new FirstOperator(predicate, resultSelector, defaultValue, this)); } +// We can cast `T -> R` in it if we pass the result selector. +// Therefore we don't provide the signature which takes both a type guard function +// as the predicate and the result selector. +// (see #1936) export interface FirstSignature { (predicate?: (value: T, index: number, source: Observable) => boolean): Observable; + (predicate?: (value: T, index: number, source: Observable) => value is S): Observable; (predicate: (value: T, index: number, source: Observable) => boolean, resultSelector: void, defaultValue?: T): Observable; + (predicate: (value: T, index: number, source: Observable) => value is S, resultSelector: void, defaultValue?: S): Observable; (predicate?: (value: T, index: number, source: Observable) => boolean, resultSelector?: (value: T, index: number) => R, defaultValue?: R): Observable; } diff --git a/src/operator/last.ts b/src/operator/last.ts index 84dafdc2e2..a7b639ca1c 100644 --- a/src/operator/last.ts +++ b/src/operator/last.ts @@ -26,9 +26,15 @@ export function last(predicate?: (value: T, index: number, source: Observa return this.lift(new LastOperator(predicate, resultSelector, defaultValue, this)); } +// We can cast `T -> R` in it if we pass the result selector. +// Therefore we don't provide the signature which takes both a type guard function +// as the predicate and the result selector. +// (see #1936) export interface LastSignature { (predicate?: (value: T, index: number, source: Observable) => boolean): Observable; + (predicate?: (value: T, index: number, source: Observable) => value is S): Observable; (predicate: (value: T, index: number, source: Observable) => boolean, resultSelector: void, defaultValue?: T): Observable; + (predicate: (value: T, index: number, source: Observable) => value is S, resultSelector: void, defaultValue?: S): Observable; (predicate?: (value: T, index: number, source: Observable) => boolean, resultSelector?: (value: T, index: number) => R, defaultValue?: R): Observable; }