Skip to content

Commit

Permalink
fix(types): add Boolean signature to filter (#4961)
Browse files Browse the repository at this point in the history
* fix(types): add Boolean signature to filter

Closes #4959

* chore: add test using comment snippet

#4959 (comment)
#4968
  • Loading branch information
cartant authored and benlesh committed Aug 26, 2019
1 parent 7606dc7 commit 259853e
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 2 deletions.
23 changes: 21 additions & 2 deletions spec-dtslint/operators/filter-spec.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { of } from 'rxjs';
import { filter } from 'rxjs/operators';
import { Observable, of } from 'rxjs';
import { filter, map } from 'rxjs/operators';

it('should support a predicate', () => {
const o = of(1, 2, 3).pipe(filter(value => value < 3)); // $ExpectType Observable<number>
Expand Down Expand Up @@ -38,3 +38,22 @@ it('should enforce user-defined type guard types', () => {
const o = of(1, 2, 3).pipe(filter((value: string): value is '1' => value < '3')); // $ExpectError
const p = of(1, 2, 3).pipe(filter((value: number, index): value is 1 => index < '3')); // $ExpectError
});

it('should support Boolean as a predicate', () => {
const o = of(1, 2, 3).pipe(filter(Boolean)); // $ExpectType Observable<number>
const p = of(1, null, undefined).pipe(filter(Boolean)); // $ExpectType Observable<number>
const q = of(null, undefined).pipe(filter(Boolean)); // $ExpectType Observable<never>
});

// I've not been able to effect a failing dtslint test for this situation and a
// conventional test won't fail because the TypeScript configuration isn't
// sufficiently strict:
// https://github.com/ReactiveX/rxjs/issues/4959#issuecomment-520629091
it('should support inference from a return type with Boolean as a predicate', () => {
interface I {
a: string | null;
}

const i$: Observable<I> = of();
const s$: Observable<string> = i$.pipe(map(i => i.a), filter(Boolean)); // $ExpectType Observable<string>
});
9 changes: 9 additions & 0 deletions spec/operators/filter-spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -330,4 +330,13 @@ describe('filter operator', () => {

// tslint:disable enable
});

it('should support Boolean as a predicate', () => {
const source = hot('-t--f--^-t-f-t-f--t-f--f--|', { t: 1, f: 0 });
const subs = '^ !';
const expected = '--t---t----t-------|';

expectObservable(source.pipe(filter(Boolean))).toBe(expected, { t: 1, f: 0 });
expectSubscriptions(source.subscriptions).toBe(subs);
});
});
1 change: 1 addition & 0 deletions src/internal/operators/filter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { Observable } from '../Observable';
import { OperatorFunction, MonoTypeOperatorFunction, TeardownLogic } from '../types';

/* tslint:disable:max-line-length */
export function filter<T>(predicate: BooleanConstructor): OperatorFunction<T, NonNullable<T>>;
export function filter<T, S extends T>(predicate: (value: T, index: number) => value is S,
thisArg?: any): OperatorFunction<T, S>;
export function filter<T>(predicate: (value: T, index: number) => boolean,
Expand Down

0 comments on commit 259853e

Please sign in to comment.