-
Notifications
You must be signed in to change notification settings - Fork 3k
/
filter-spec.ts
59 lines (47 loc) · 2.46 KB
/
filter-spec.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
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>
});
it('should support a predicate with an index', () => {
const o = of(1, 2, 3).pipe(filter((value, index) => index < 3)); // $ExpectType Observable<number>
});
it('should support a predicate and an argument', () => {
const o = of(1, 2, 3).pipe(filter(value => value < 3, 'bonjour')); // $ExpectType Observable<number>
});
it('should support a user-defined type guard', () => {
const o = of(1, 2, 3).pipe(filter((value: number): value is 1 => value < 3)); // $ExpectType Observable<1>
});
it('should support a user-defined type guard with an index', () => {
const o = of(1, 2, 3).pipe(filter((value: number, index): value is 1 => index < 3)); // $ExpectType Observable<1>
});
it('should support a user-defined type guard and an argument', () => {
const o = of(1, 2, 3).pipe(filter((value: number): value is 1 => value < 3, 'hola')); // $ExpectType Observable<1>
});
it('should enforce types', () => {
const o = of(1, 2, 3).pipe(filter()); // $ExpectError
});
it('should enforce predicate types', () => {
const o = of(1, 2, 3).pipe(filter(value => value < '3')); // $ExpectError
const p = of(1, 2, 3).pipe(filter((value, index) => index < '3')); // $ExpectError
});
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>
});