From d62fbf04fec0cbe7f9bdae70555c342430c3da00 Mon Sep 17 00:00:00 2001 From: Tetsuharu OHZEKI Date: Mon, 12 Sep 2016 13:06:01 +0900 Subject: [PATCH 1/4] feat(filter): Observable.filter() can take type guard as the predicate function --- src/operator/filter.ts | 1 + 1 file changed, 1 insertion(+) 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 { From b952718d35ddda77124a043afbe0a7832620fe3b Mon Sep 17 00:00:00 2001 From: Tetsuharu OHZEKI Date: Wed, 14 Sep 2016 14:02:00 +0900 Subject: [PATCH 2/4] feat(find): Observable.find() can take type guard as the predicate function --- src/operator/find.ts | 1 + 1 file changed, 1 insertion(+) 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 { From f99ca49a30287d73bca3cb063ab73b191dcedf26 Mon Sep 17 00:00:00 2001 From: Tetsuharu OHZEKI Date: Wed, 14 Sep 2016 14:04:39 +0900 Subject: [PATCH 3/4] feat(first): Observable.first() can take type guard as the predicate function --- src/operator/first.ts | 6 ++++++ 1 file changed, 6 insertions(+) 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; } From 76a8a5743948266ef0af8d1833a790d2448ad99f Mon Sep 17 00:00:00 2001 From: Tetsuharu OHZEKI Date: Wed, 14 Sep 2016 14:14:33 +0900 Subject: [PATCH 4/4] feat(last): Observable.last() can take type guard as the predicate function --- src/operator/last.ts | 6 ++++++ 1 file changed, 6 insertions(+) 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; }