Skip to content

Commit f99ca49

Browse files
feat(first): Observable<T>.first() can take type guard as the predicate function
1 parent b952718 commit f99ca49

File tree

1 file changed

+6
-0
lines changed

1 file changed

+6
-0
lines changed

src/operator/first.ts

+6
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
}

0 commit comments

Comments
 (0)