Skip to content

Commit b7866a0

Browse files
timdeschryverbenlesh
authored andcommitted
fix(startWith): allow empty type signature and passing a different type
* fix(startWith): add empty signature * test(dtslint): add startWith tests * feat(startWith): allow different types * fix(compat): add typings to startWith
1 parent 9ea0ec9 commit b7866a0

File tree

4 files changed

+51
-19
lines changed

4 files changed

+51
-19
lines changed

compat/operator/startWith.ts

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@ import { Observable, SchedulerLike } from 'rxjs';
22
import { startWith as higherOrder } from 'rxjs/operators';
33

44
/* tslint:disable:max-line-length */
5-
export function startWith<T>(this: Observable<T>, v1: T, scheduler?: SchedulerLike): Observable<T>;
6-
export function startWith<T>(this: Observable<T>, v1: T, v2: T, scheduler?: SchedulerLike): Observable<T>;
7-
export function startWith<T>(this: Observable<T>, v1: T, v2: T, v3: T, scheduler?: SchedulerLike): Observable<T>;
8-
export function startWith<T>(this: Observable<T>, v1: T, v2: T, v3: T, v4: T, scheduler?: SchedulerLike): Observable<T>;
9-
export function startWith<T>(this: Observable<T>, v1: T, v2: T, v3: T, v4: T, v5: T, scheduler?: SchedulerLike): Observable<T>;
10-
export function startWith<T>(this: Observable<T>, v1: T, v2: T, v3: T, v4: T, v5: T, v6: T, scheduler?: SchedulerLike): Observable<T>;
11-
export function startWith<T>(this: Observable<T>, ...array: Array<T | SchedulerLike>): Observable<T>;
5+
export function startWith<T>(this: Observable<T>, scheduler?: SchedulerLike): Observable<T>;
6+
export function startWith<T, D = T>(this: Observable<T>, v1: D, scheduler?: SchedulerLike): Observable<T | D>;
7+
export function startWith<T, D = T, E = T>(this: Observable<T>, v1: D, v2: E, scheduler?: SchedulerLike): Observable<T | D | E>;
8+
export function startWith<T, D = T, E = T, F = T>(this: Observable<T>, v1: D, v2: E, v3: F, scheduler?: SchedulerLike): Observable<T | D | E | F>;
9+
export function startWith<T, D = T, E = T, F = T, G = T>(this: Observable<T>, v1: D, v2: E, v3: F, v4: G, scheduler?: SchedulerLike): Observable<T | D | E | F | G>;
10+
export function startWith<T, D = T, E = T, F = T, G = T, H = T>(this: Observable<T>, v1: D, v2: E, v3: F, v4: G, v5: H, scheduler?: SchedulerLike): Observable<T | D | E | F | G | H>;
11+
export function startWith<T, D = T, E = T, F = T, G = T, H = T, I = T>(this: Observable<T>, v1: D, v2: E, v3: F, v4: G, v5: H, v6: I, scheduler?: SchedulerLike): Observable<T | D | E | F | G | H | I>;
12+
export function startWith<T, D = T>(this: Observable<T>, ...array: Array<D | SchedulerLike>): Observable<T | D>;
1213
/* tslint:enable:max-line-length */
1314

1415
/**
@@ -25,6 +26,6 @@ export function startWith<T>(this: Observable<T>, ...array: Array<T | SchedulerL
2526
* @method startWith
2627
* @owner Observable
2728
*/
28-
export function startWith<T>(this: Observable<T>, ...array: Array<T | SchedulerLike>): Observable<T> {
29-
return higherOrder(...array)(this);
29+
export function startWith<T, D>(this: Observable<T>, ...array: Array<D | SchedulerLike>): Observable<T |D> {
30+
return higherOrder<T, D>(...array)(this);
3031
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import { of, asyncScheduler } from 'rxjs';
2+
import { startWith } from 'rxjs/operators';
3+
4+
it('should infer correctly with one value', () => {
5+
const o = of(1, 2, 3).pipe(startWith(4)); // $ExpectType Observable<number>
6+
});
7+
8+
it('should infer correctly with multiple values', () => {
9+
const o = of(1, 2, 3).pipe(startWith(4, 5, 6)); // $ExpectType Observable<number>
10+
});
11+
12+
it('should infer correctly with no value', () => {
13+
const o = of(1, 2, 3).pipe(startWith()); // $ExpectType Observable<number>
14+
});
15+
16+
it('should infer correctly with a value and a scheduler', () => {
17+
const o = of(1, 2, 3).pipe(startWith(5, asyncScheduler)); // $ExpectType Observable<number>
18+
});
19+
20+
it('should infer correctly with a different type', () => {
21+
const o = of(1, 2, 3).pipe(startWith('foo')); // $ExpectType Observable<string | number>
22+
});
23+
24+
it('should infer correctly with multiple different types', () => {
25+
const o = of(1, 2, 3).pipe(startWith('foo', 4, true)); // $ExpectType Observable<string | number | boolean>
26+
});
27+
28+
it('should infer correctly with only a scheduler', () => {
29+
const o = of(1, 2, 3).pipe(startWith(asyncScheduler)); // $ExpectType Observable<number>
30+
});

spec/operators/startWith-spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ describe('startWith operator', () => {
136136
const e1subs = '^ !';
137137
const expected = '-a-|';
138138

139-
expectObservable(e1.pipe(startWith<any>(rxTestScheduler))).toBe(expected);
139+
expectObservable(e1.pipe(startWith(rxTestScheduler))).toBe(expected);
140140
expectSubscriptions(e1.subscriptions).toBe(e1subs);
141141
});
142142

src/internal/operators/startWith.ts

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,17 @@ import { scalar } from '../observable/scalar';
44
import { empty } from '../observable/empty';
55
import { concat as concatStatic } from '../observable/concat';
66
import { isScheduler } from '../util/isScheduler';
7-
import { MonoTypeOperatorFunction, SchedulerLike } from '../types';
7+
import { MonoTypeOperatorFunction, OperatorFunction, SchedulerLike } from '../types';
88

99
/* tslint:disable:max-line-length */
10-
export function startWith<T>(v1: T, scheduler?: SchedulerLike): MonoTypeOperatorFunction<T>;
11-
export function startWith<T>(v1: T, v2: T, scheduler?: SchedulerLike): MonoTypeOperatorFunction<T>;
12-
export function startWith<T>(v1: T, v2: T, v3: T, scheduler?: SchedulerLike): MonoTypeOperatorFunction<T>;
13-
export function startWith<T>(v1: T, v2: T, v3: T, v4: T, scheduler?: SchedulerLike): MonoTypeOperatorFunction<T>;
14-
export function startWith<T>(v1: T, v2: T, v3: T, v4: T, v5: T, scheduler?: SchedulerLike): MonoTypeOperatorFunction<T>;
15-
export function startWith<T>(v1: T, v2: T, v3: T, v4: T, v5: T, v6: T, scheduler?: SchedulerLike): MonoTypeOperatorFunction<T>;
16-
export function startWith<T>(...array: Array<T | SchedulerLike>): MonoTypeOperatorFunction<T>;
10+
export function startWith<T>(scheduler?: SchedulerLike): MonoTypeOperatorFunction<T>;
11+
export function startWith<T, D = T>(v1: D, scheduler?: SchedulerLike): OperatorFunction<T, T | D>;
12+
export function startWith<T, D = T, E = T>(v1: D, v2: E, scheduler?: SchedulerLike): OperatorFunction<T, T | D | E>;
13+
export function startWith<T, D = T, E = T, F = T>(v1: D, v2: E, v3: F, scheduler?: SchedulerLike): OperatorFunction<T, T | D | E | F>;
14+
export function startWith<T, D = T, E = T, F = T, G = T>(v1: D, v2: E, v3: F, v4: G, scheduler?: SchedulerLike): OperatorFunction<T, T | D | E | F | G>;
15+
export function startWith<T, D = T, E = T, F = T, G = T, H = T>(v1: D, v2: E, v3: F, v4: G, v5: H, scheduler?: SchedulerLike): OperatorFunction<T, T | D | E | F | G | H>;
16+
export function startWith<T, D = T, E = T, F = T, G = T, H = T, I = T>(v1: D, v2: E, v3: F, v4: G, v5: H, v6: I, scheduler?: SchedulerLike): OperatorFunction<T, T | D | E | F | G | H | I>;
17+
export function startWith<T, D = T>(...array: Array<D | SchedulerLike>): OperatorFunction<T, T | D>;
1718
/* tslint:enable:max-line-length */
1819

1920
/**
@@ -48,7 +49,7 @@ export function startWith<T>(...array: Array<T | SchedulerLike>): MonoTypeOperat
4849
* @method startWith
4950
* @owner Observable
5051
*/
51-
export function startWith<T>(...array: Array<T | SchedulerLike>): MonoTypeOperatorFunction<T> {
52+
export function startWith<T, D>(...array: Array<T | SchedulerLike>): OperatorFunction<T, T | D> {
5253
return (source: Observable<T>) => {
5354
let scheduler = <SchedulerLike>array[array.length - 1];
5455
if (isScheduler(scheduler)) {

0 commit comments

Comments
 (0)