Skip to content

Commit 922d04e

Browse files
authored
Merge pull request #2119 from rob3c/fix-type-guard-propagation
feat(filter, find, first, last): support type guard predicates that don't requiring casting
2 parents bf3c043 + 07ecd5e commit 922d04e

File tree

4 files changed

+24
-11
lines changed

4 files changed

+24
-11
lines changed

src/operator/filter.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,10 @@ import { TeardownLogic } from '../Subscription';
4444
* @owner Observable
4545
*/
4646
/* tslint:disable:max-line-length */
47-
export function filter<T>(this: Observable<T>, predicate: (value: T, index: number) => boolean, thisArg?: any): Observable<T>;
48-
export function filter<T, S extends T>(this: Observable<T>, predicate: (value: T, index: number) => value is S, thisArg?: any): Observable<S>;
49-
/* tslint:disable:max-line-length */
47+
export function filter<T, S extends T>(this: Observable<T>,
48+
predicate: ((value: T, index: number) => boolean) |
49+
((value: T, index: number) => value is S),
50+
thisArg?: any): Observable<S>;
5051
export function filter<T>(this: Observable<T>, predicate: (value: T, index: number) => boolean,
5152
thisArg?: any): Observable<T> {
5253
return this.lift(new FilterOperator(predicate, thisArg));

src/operator/find.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,10 @@ import { Subscriber } from '../Subscriber';
3636
* @owner Observable
3737
*/
3838
/* tslint:disable:max-line-length */
39-
export function find<T>(this: Observable<T>, predicate: (value: T, index: number, source: Observable<T>) => boolean, thisArg?: any): Observable<T>;
40-
export function find<T, S extends T>(this: Observable<T>, predicate: (value: T, index: number, source: Observable<T>) => value is S, thisArg?: any): Observable<S>;
39+
export function find<T, S extends T>(this: Observable<T>,
40+
predicate: ((value: T, index: number, source: Observable<T>) => boolean) |
41+
((value: T, index: number, source: Observable<T>) => value is S),
42+
thisArg?: any): Observable<S>;
4143
/* tslint:disable:max-line-length */
4244
export function find<T>(this: Observable<T>, predicate: (value: T, index: number, source: Observable<T>) => boolean,
4345
thisArg?: any): Observable<T> {

src/operator/first.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,15 @@ import { EmptyError } from '../util/EmptyError';
5353
* @owner Observable
5454
*/
5555
/* tslint:disable:max-line-length */
56-
export function first<T>(this: Observable<T>, predicate?: (value: T, index: number, source: Observable<T>) => boolean): Observable<T>;
57-
export function first<T, S extends T>(this: Observable<T>, predicate?: (value: T, index: number, source: Observable<T>) => value is S): Observable<S>;
56+
export function first<T, S extends T>(this: Observable<T>,
57+
predicate?: ((value: T, index: number, source: Observable<T>) => boolean) |
58+
((value: T, index: number, source: Observable<T>) => value is S)): Observable<S>;
5859
export function first<T>(this: Observable<T>, predicate: (value: T, index: number, source: Observable<T>) => boolean, resultSelector: void, defaultValue?: T): Observable<T>;
59-
export function first<T, S extends T>(this: Observable<T>, predicate: (value: T, index: number, source: Observable<T>) => value is S, resultSelector: void, defaultValue?: S): Observable<S>;
60+
export function first<T, S extends T, R>(this: Observable<T>,
61+
predicate: ((value: T, index: number, source: Observable<T>) => boolean) |
62+
((value: T, index: number, source: Observable<T>) => value is S),
63+
resultSelector?: ((value: S, index: number) => R) | void,
64+
defaultValue?: S): Observable<S>;
6065
export function first<T, R>(this: Observable<T>, predicate?: (value: T, index: number, source: Observable<T>) => boolean, resultSelector?: (value: T, index: number) => R, defaultValue?: R): Observable<R>;
6166
/* tslint:disable:max-line-length */
6267
export function first<T, R>(this: Observable<T>, predicate?: (value: T, index: number, source: Observable<T>) => boolean,

src/operator/last.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,15 @@ import { EmptyError } from '../util/EmptyError';
2121
* @owner Observable
2222
*/
2323
/* tslint:disable:max-line-length */
24-
export function last<T>(this: Observable<T>, predicate?: (value: T, index: number, source: Observable<T>) => boolean): Observable<T>;
25-
export function last<T, S extends T>(this: Observable<T>, predicate?: (value: T, index: number, source: Observable<T>) => value is S): Observable<S>;
24+
export function last<T, S extends T>(this: Observable<T>,
25+
predicate?: ((value: T, index: number, source: Observable<T>) => boolean) |
26+
((value: T, index: number, source: Observable<T>) => value is S)): Observable<S>;
2627
export function last<T>(this: Observable<T>, predicate: (value: T, index: number, source: Observable<T>) => boolean, resultSelector: void, defaultValue?: T): Observable<T>;
27-
export function last<T, S extends T>(this: Observable<T>, predicate: (value: T, index: number, source: Observable<T>) => value is S, resultSelector: void, defaultValue?: S): Observable<S>;
28+
export function last<T, S extends T, R>(this: Observable<T>,
29+
predicate: ((value: T, index: number, source: Observable<T>) => boolean) |
30+
((value: T, index: number, source: Observable<T>) => value is S),
31+
resultSelector?: ((value: S, index: number) => R) | void,
32+
defaultValue?: S): Observable<S>;
2833
export function last<T, R>(this: Observable<T>, predicate?: (value: T, index: number, source: Observable<T>) => boolean, resultSelector?: (value: T, index: number) => R, defaultValue?: R): Observable<R>;
2934
/* tslint:disable:max-line-length */
3035
export function last<T, R>(this: Observable<T>, predicate?: (value: T, index: number, source: Observable<T>) => boolean,

0 commit comments

Comments
 (0)