Skip to content

Commit

Permalink
fix: forkJoin/combineLatest return Observable<unknown> if passed any
Browse files Browse the repository at this point in the history
  • Loading branch information
benlesh committed Apr 14, 2021
1 parent 6fa819b commit 43da0a2
Show file tree
Hide file tree
Showing 6 changed files with 19 additions and 0 deletions.
2 changes: 2 additions & 0 deletions api_guard/dist/types/index.d.ts
Expand Up @@ -52,6 +52,7 @@ export declare function combineLatest<A extends readonly unknown[]>(...sourcesAn
export declare function combineLatest(sourcesObject: {
[K in any]: never;
}): Observable<never>;
export declare function combineLatest<T extends AnyCatcher>(arg: T): Observable<unknown>;
export declare function combineLatest<T extends Record<string, ObservableInput<any>>>(sourcesObject: T): Observable<{
[K in keyof T]: ObservedValueOf<T[K]>;
}>;
Expand Down Expand Up @@ -134,6 +135,7 @@ export declare function forkJoin<A extends readonly unknown[], R>(...sourcesAndR
export declare function forkJoin(sourcesObject: {
[K in any]: never;
}): Observable<never>;
export declare function forkJoin<T extends AnyCatcher>(arg: T): Observable<unknown>;
export declare function forkJoin<T extends Record<string, ObservableInput<any>>>(sourcesObject: T): Observable<{
[K in keyof T]: ObservedValueOf<T[K]>;
}>;
Expand Down
5 changes: 5 additions & 0 deletions spec-dtslint/observables/combineLatest-spec.ts
Expand Up @@ -147,3 +147,8 @@ describe('combineLatest({})', () => {
const res = combineLatest(obj); // $ExpectError
});
});

it('should take in any and return Observable<unknown> because we do not know if it is an array or object', () => {
const arg: any = null;
const res = combineLatest(arg); // $ExpectType Observable<unknown>
});
5 changes: 5 additions & 0 deletions spec-dtslint/observables/forkJoin-spec.ts
Expand Up @@ -117,4 +117,9 @@ describe('forkJoin([])', () => {
it('should force user cast for array of 6+ observables', () => {
const res = forkJoin([of(1, 2, 3), of('a', 'b', 'c'), of(1, 2, 3), of(1, 2, 3), of(1, 2, 3), of(1, 2, 3), of(1, 2, 3)]); // $ExpectType Observable<[number, string, number, number, number, number, number]>
});

it('should return unknown for argument of any', () => {
const arg: any = null;
const res = forkJoin(arg); // $ExpectType Observable<unknown>
})
});
3 changes: 3 additions & 0 deletions src/internal/AnyCatcher.ts
@@ -0,0 +1,3 @@
export interface AnyCatcher {
'@@@@@@CATCH_ANY_WITH_THIS@@@@@@@@': 'wat';
}
2 changes: 2 additions & 0 deletions src/internal/observable/combineLatest.ts
Expand Up @@ -9,6 +9,7 @@ import { mapOneOrManyArgs } from '../util/mapOneOrManyArgs';
import { popResultSelector, popScheduler } from '../util/args';
import { createObject } from '../util/createObject';
import { OperatorSubscriber } from '../operators/OperatorSubscriber';
import { AnyCatcher } from '../AnyCatcher';

// combineLatest([a, b, c])
export function combineLatest(sources: []): Observable<never>;
Expand Down Expand Up @@ -47,6 +48,7 @@ export function combineLatest<A extends readonly unknown[]>(

// combineLatest({a, b, c})
export function combineLatest(sourcesObject: { [K in any]: never }): Observable<never>;
export function combineLatest<T extends AnyCatcher>(arg: T): Observable<unknown>;
export function combineLatest<T extends Record<string, ObservableInput<any>>>(
sourcesObject: T
): Observable<{ [K in keyof T]: ObservedValueOf<T[K]> }>;
Expand Down
2 changes: 2 additions & 0 deletions src/internal/observable/forkJoin.ts
Expand Up @@ -6,6 +6,7 @@ import { popResultSelector } from '../util/args';
import { OperatorSubscriber } from '../operators/OperatorSubscriber';
import { mapOneOrManyArgs } from '../util/mapOneOrManyArgs';
import { createObject } from '../util/createObject';
import { AnyCatcher } from '../AnyCatcher';

export function forkJoin(scheduler: null | undefined): Observable<never>;

Expand All @@ -27,6 +28,7 @@ export function forkJoin<A extends readonly unknown[], R>(

// forkJoin({a, b, c})
export function forkJoin(sourcesObject: { [K in any]: never }): Observable<never>;
export function forkJoin<T extends AnyCatcher>(arg: T): Observable<unknown>;
export function forkJoin<T extends Record<string, ObservableInput<any>>>(
sourcesObject: T
): Observable<{ [K in keyof T]: ObservedValueOf<T[K]> }>;
Expand Down

0 comments on commit 43da0a2

Please sign in to comment.