Skip to content

Commit e91d113

Browse files
authored
Merge pull request #1936 from saneyuki/filter-typing
feat(filter): Observable<T>.filter() can take a type guard as the predicate function
2 parents 36c7676 + 76a8a57 commit e91d113

File tree

4 files changed

+14
-0
lines changed

4 files changed

+14
-0
lines changed

src/operator/filter.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ export function filter<T>(predicate: (value: T, index: number) => boolean,
5050

5151
export interface FilterSignature<T> {
5252
(predicate: (value: T, index: number) => boolean, thisArg?: any): Observable<T>;
53+
<S extends T>(predicate: (value: T, index: number) => value is S, thisArg?: any): Observable<S>;
5354
}
5455

5556
class FilterOperator<T> implements Operator<T, T> {

src/operator/find.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ export function find<T>(predicate: (value: T, index: number, source: Observable<
4545

4646
export interface FindSignature<T> {
4747
(predicate: (value: T, index: number, source: Observable<T>) => boolean, thisArg?: any): Observable<T>;
48+
<S extends T>(predicate: (value: T, index: number, source: Observable<T>) => value is S, thisArg?: any): Observable<S>;
4849
}
4950

5051
export class FindValueOperator<T> implements Operator<T, T> {

src/operator/first.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,15 @@ export function first<T, R>(predicate?: (value: T, index: number, source: Observ
5858
return this.lift(new FirstOperator(predicate, resultSelector, defaultValue, this));
5959
}
6060

61+
// We can cast `T -> R` in it if we pass the result selector.
62+
// Therefore we don't provide the signature which takes both a type guard function
63+
// as the predicate and the result selector.
64+
// (see #1936)
6165
export interface FirstSignature<T> {
6266
(predicate?: (value: T, index: number, source: Observable<T>) => boolean): Observable<T>;
67+
<S extends T>(predicate?: (value: T, index: number, source: Observable<T>) => value is S): Observable<S>;
6368
(predicate: (value: T, index: number, source: Observable<T>) => boolean, resultSelector: void, defaultValue?: T): Observable<T>;
69+
<S extends T>(predicate: (value: T, index: number, source: Observable<T>) => value is S, resultSelector: void, defaultValue?: S): Observable<S>;
6470
<R>(predicate?: (value: T, index: number, source: Observable<T>) => boolean, resultSelector?: (value: T, index: number) => R,
6571
defaultValue?: R): Observable<R>;
6672
}

src/operator/last.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,15 @@ export function last<T, R>(predicate?: (value: T, index: number, source: Observa
2626
return this.lift(new LastOperator(predicate, resultSelector, defaultValue, this));
2727
}
2828

29+
// We can cast `T -> R` in it if we pass the result selector.
30+
// Therefore we don't provide the signature which takes both a type guard function
31+
// as the predicate and the result selector.
32+
// (see #1936)
2933
export interface LastSignature<T> {
3034
(predicate?: (value: T, index: number, source: Observable<T>) => boolean): Observable<T>;
35+
<S extends T>(predicate?: (value: T, index: number, source: Observable<T>) => value is S): Observable<S>;
3136
(predicate: (value: T, index: number, source: Observable<T>) => boolean, resultSelector: void, defaultValue?: T): Observable<T>;
37+
<S extends T>(predicate: (value: T, index: number, source: Observable<T>) => value is S, resultSelector: void, defaultValue?: S): Observable<S>;
3238
<R>(predicate?: (value: T, index: number, source: Observable<T>) => boolean, resultSelector?: (value: T, index: number) => R,
3339
defaultValue?: R): Observable<R>;
3440
}

0 commit comments

Comments
 (0)