diff --git a/api_guard/dist/types/index.d.ts b/api_guard/dist/types/index.d.ts index 18585e7b12..2f610e8800 100644 --- a/api_guard/dist/types/index.d.ts +++ b/api_guard/dist/types/index.d.ts @@ -201,8 +201,6 @@ export declare type Head = ((...args: X) => any) exten export declare function identity(x: T): T; -export declare function iif(condition: () => true, trueResult: ObservableInput, falseResult: ObservableInput): Observable; -export declare function iif(condition: () => false, trueResult: ObservableInput, falseResult: ObservableInput): Observable; export declare function iif(condition: () => boolean, trueResult: ObservableInput, falseResult: ObservableInput): Observable; export interface InteropObservable { diff --git a/api_guard/dist/types/operators/index.d.ts b/api_guard/dist/types/operators/index.d.ts index 3a85ca4d31..fe2b5d0da7 100644 --- a/api_guard/dist/types/operators/index.d.ts +++ b/api_guard/dist/types/operators/index.d.ts @@ -130,8 +130,6 @@ export declare function first(predicate: BooleanConstructor): OperatorFunctio export declare function first(predicate: BooleanConstructor, defaultValue: D): OperatorFunction | D>; export declare function first(predicate: (value: T, index: number, source: Observable) => value is S, defaultValue?: S): OperatorFunction; export declare function first(predicate: (value: T, index: number, source: Observable) => value is S, defaultValue: D): OperatorFunction; -export declare function first(predicate: (value: T, index: number, source: Observable) => false, defaultValue: D): OperatorFunction; -export declare function first(predicate: (value: T, index: number, source: Observable) => false): OperatorFunction; export declare function first(predicate: (value: T, index: number, source: Observable) => boolean, defaultValue?: D): OperatorFunction; export declare const flatMap: typeof mergeMap; @@ -150,8 +148,6 @@ export declare function last(predicate: BooleanConstructor): OperatorFunction export declare function last(predicate: BooleanConstructor, defaultValue: D): OperatorFunction | D>; export declare function last(predicate?: null, defaultValue?: D): OperatorFunction; export declare function last(predicate: (value: T, index: number, source: Observable) => value is S, defaultValue?: S): OperatorFunction; -export declare function last(predicate: (value: T, index: number, source: Observable) => false, defaultValue: D): OperatorFunction; -export declare function last(predicate: (value: T, index: number, source: Observable) => false): OperatorFunction; export declare function last(predicate: (value: T, index: number, source: Observable) => boolean, defaultValue?: D): OperatorFunction; export declare function map(project: (value: T, index: number) => R, thisArg?: any): OperatorFunction; @@ -256,7 +252,6 @@ export declare function shareReplay(config: ShareReplayConfig): MonoTypeOpera export declare function shareReplay(bufferSize?: number, windowTime?: number, scheduler?: SchedulerLike): MonoTypeOperatorFunction; export declare function single(predicate: BooleanConstructor): OperatorFunction>; -export declare function single(predicate: (value: T, index: number, source: Observable) => false): OperatorFunction; export declare function single(predicate?: (value: T, index: number, source: Observable) => boolean): MonoTypeOperatorFunction; export declare function skip(count: number): MonoTypeOperatorFunction; @@ -298,8 +293,6 @@ export declare function takeLast(count: number): MonoTypeOperatorFunction; export declare function takeUntil(notifier: ObservableInput): MonoTypeOperatorFunction; -export declare function takeWhile(predicate: (value: T, index: number) => false, inclusive: true): MonoTypeOperatorFunction; -export declare function takeWhile(predicate: (value: T, index: number) => false, inclusive?: false): OperatorFunction; export declare function takeWhile(predicate: BooleanConstructor): OperatorFunction extends never ? never : T>; export declare function takeWhile(predicate: BooleanConstructor, inclusive: false): OperatorFunction extends never ? never : T>; export declare function takeWhile(predicate: BooleanConstructor, inclusive: true): MonoTypeOperatorFunction; diff --git a/spec-dtslint/observables/iif-spec.ts b/spec-dtslint/observables/iif-spec.ts index 554d4afb44..8fbf38fff0 100644 --- a/spec-dtslint/observables/iif-spec.ts +++ b/spec-dtslint/observables/iif-spec.ts @@ -16,10 +16,19 @@ it('should error for incorrect parameters', () => { }); it('should infer correctly', () => { - const r0 = iif(() => false, a$, b$); // $ExpectType Observable - const r1 = iif(() => true, a$, b$); // $ExpectType Observable + const r0 = iif(() => false, a$, b$); // $ExpectType Observable + const r1 = iif(() => true, a$, b$); // $ExpectType Observable const r2 = iif(randomBoolean, a$, b$); // $ExpectType Observable - const r3 = iif(() => false, a$, EMPTY); // $ExpectType Observable - const r4 = iif(() => true, EMPTY, b$); // $ExpectType Observable + const r3 = iif(() => false, a$, EMPTY); // $ExpectType Observable + const r4 = iif(() => true, EMPTY, b$); // $ExpectType Observable const r5 = iif(randomBoolean, EMPTY, EMPTY); // $ExpectType Observable }); + + +it('should support inference from a predicate that returns any', () => { + function alwaysTrueButReturnsAny(): any { + return true; + } + + const o$ = iif(alwaysTrueButReturnsAny, a$, b$) // $ExpectType Observable +}); \ No newline at end of file diff --git a/spec-dtslint/operators/first-spec.ts b/spec-dtslint/operators/first-spec.ts index 1836b669ee..501ceea0d9 100644 --- a/spec-dtslint/operators/first-spec.ts +++ b/spec-dtslint/operators/first-spec.ts @@ -65,4 +65,12 @@ it('should work properly with the Boolean constructor', () => { const o3 = of('' as const, 'hi' as const).pipe(first(Boolean)); // $ExpectType Observable<"hi"> const o4 = of(0 as const, 'hi' as const).pipe(first(Boolean)); // $ExpectType Observable<"hi"> const o5 = of(0 as const, 'hi' as const, 'what' as const).pipe(first(Boolean)); // $ExpectType Observable<"hi" | "what"> -}) \ No newline at end of file +}); + +it('should support inference from a predicate that returns any', () => { + function isTruthy(value: number): any { + return !!value; + } + + const o$ = of(1).pipe(first(isTruthy)); // $ExpectType Observable +}); \ No newline at end of file diff --git a/spec-dtslint/operators/last-spec.ts b/spec-dtslint/operators/last-spec.ts index 1d90c43159..be72063b5d 100644 --- a/spec-dtslint/operators/last-spec.ts +++ b/spec-dtslint/operators/last-spec.ts @@ -64,8 +64,8 @@ it('should default D to T with a predicate', () => { }); it('should handle predicates that always return false properly', () => { - const a = of('foo', 'bar').pipe(last(() => false as const)); // $ExpectType Observable - const b = of('foo', 'bar').pipe(last(() => false as const, 1337 as const)); // $ExpectType Observable<1337> + const a = of('foo', 'bar').pipe(last(() => false as const)); // $ExpectType Observable + const b = of('foo', 'bar').pipe(last(() => false as const, 1337 as const)); // $ExpectType Observable }); it('should handle Boolean constructor properly', () => { @@ -73,4 +73,12 @@ it('should handle Boolean constructor properly', () => { const b = of(0 as const, -0 as const, null, undefined, false as const, '' as const, 0n as const).pipe(last(Boolean, 'test' as const)); // $ExpectType Observable<"test"> const c = of(0 as const, -0 as const, null, 'hi' as const, undefined, false as const, '' as const, 0n as const).pipe(last(Boolean)); // $ExpectType Observable<"hi"> const d = of(0 as const, -0 as const, null, 'hi' as const, undefined, false as const, '' as const, 0n as const).pipe(last(Boolean, 'test' as const)); // $ExpectType Observable<"test" | "hi"> -}) \ No newline at end of file +}); + +it('should support inference from a predicate that returns any', () => { + function isTruthy(value: number): any { + return !!value; + } + + const o$ = of(1).pipe(last(isTruthy)); // $ExpectType Observable +}); \ No newline at end of file diff --git a/spec-dtslint/operators/single-spec.ts b/spec-dtslint/operators/single-spec.ts index a05b03204c..c564d68f40 100644 --- a/spec-dtslint/operators/single-spec.ts +++ b/spec-dtslint/operators/single-spec.ts @@ -39,5 +39,13 @@ it('should handle Boolean constructor properly', () => { }); it('should handle predicates that always return false properly', () => { - const a = of(1, 2, 3, 4).pipe(single(() => false as const)); // $ExpectType Observable + const a = of(1, 2, 3, 4).pipe(single(() => false as const)); // $ExpectType Observable +}); + +it('should support inference from a predicate that returns any', () => { + function isTruthy(value: number): any { + return !!value; + } + + const o$ = of(1).pipe(single(isTruthy)); // $ExpectType Observable }); \ No newline at end of file diff --git a/spec-dtslint/operators/takeWhile-spec.ts b/spec-dtslint/operators/takeWhile-spec.ts index 74cd3ab1f0..f3778f692b 100644 --- a/spec-dtslint/operators/takeWhile-spec.ts +++ b/spec-dtslint/operators/takeWhile-spec.ts @@ -27,6 +27,14 @@ it('should properly support Boolean constructor', () => { }); it('should properly handle predicates that always return false', () => { - const a = of(1, 2, 3).pipe(takeWhile(() => false as const)); // $ExpectType Observable + const a = of(1, 2, 3).pipe(takeWhile(() => false as const)); // $ExpectType Observable const b = of(1, 2, 3).pipe(takeWhile(() => false as const, true)); // $ExpectType Observable +}); + +it('should support inference from a predicate that returns any', () => { + function isTruthy(value: number): any { + return !!value; + } + + const o$ = of(1).pipe(takeWhile(isTruthy)); // $ExpectType Observable }); \ No newline at end of file diff --git a/src/internal/observable/iif.ts b/src/internal/observable/iif.ts index 7b86ea96c9..672710408e 100644 --- a/src/internal/observable/iif.ts +++ b/src/internal/observable/iif.ts @@ -3,12 +3,6 @@ import { Observable } from '../Observable'; import { defer } from './defer'; import { ObservableInput } from '../types'; -export function iif(condition: () => true, trueResult: ObservableInput, falseResult: ObservableInput): Observable; - -export function iif(condition: () => false, trueResult: ObservableInput, falseResult: ObservableInput): Observable; - -export function iif(condition: () => boolean, trueResult: ObservableInput, falseResult: ObservableInput): Observable; - /** * Checks a boolean at subscription time, and chooses between one of two observable sources * diff --git a/src/internal/operators/first.ts b/src/internal/operators/first.ts index 2f09673cea..8334656cd7 100644 --- a/src/internal/operators/first.ts +++ b/src/internal/operators/first.ts @@ -19,8 +19,6 @@ export function first( predicate: (value: T, index: number, source: Observable) => value is S, defaultValue: D ): OperatorFunction; -export function first(predicate: (value: T, index: number, source: Observable) => false, defaultValue: D): OperatorFunction; -export function first(predicate: (value: T, index: number, source: Observable) => false): OperatorFunction; export function first( predicate: (value: T, index: number, source: Observable) => boolean, defaultValue?: D diff --git a/src/internal/operators/last.ts b/src/internal/operators/last.ts index 05040ed37f..2e45e17c1f 100644 --- a/src/internal/operators/last.ts +++ b/src/internal/operators/last.ts @@ -15,8 +15,6 @@ export function last( predicate: (value: T, index: number, source: Observable) => value is S, defaultValue?: S ): OperatorFunction; -export function last(predicate: (value: T, index: number, source: Observable) => false, defaultValue: D): OperatorFunction; -export function last(predicate: (value: T, index: number, source: Observable) => false): OperatorFunction; export function last( predicate: (value: T, index: number, source: Observable) => boolean, defaultValue?: D diff --git a/src/internal/operators/single.ts b/src/internal/operators/single.ts index 897db2a9b1..9307086554 100644 --- a/src/internal/operators/single.ts +++ b/src/internal/operators/single.ts @@ -9,7 +9,6 @@ import { operate } from '../util/lift'; import { OperatorSubscriber } from './OperatorSubscriber'; export function single(predicate: BooleanConstructor): OperatorFunction>; -export function single(predicate: (value: T, index: number, source: Observable) => false): OperatorFunction; export function single(predicate?: (value: T, index: number, source: Observable) => boolean): MonoTypeOperatorFunction; /** diff --git a/src/internal/operators/takeWhile.ts b/src/internal/operators/takeWhile.ts index 151eac4aaa..fd88c290d5 100644 --- a/src/internal/operators/takeWhile.ts +++ b/src/internal/operators/takeWhile.ts @@ -3,8 +3,6 @@ import { OperatorFunction, MonoTypeOperatorFunction, Falsy } from '../types'; import { operate } from '../util/lift'; import { OperatorSubscriber } from './OperatorSubscriber'; -export function takeWhile(predicate: (value: T, index: number) => false, inclusive: true): MonoTypeOperatorFunction; -export function takeWhile(predicate: (value: T, index: number) => false, inclusive?: false): OperatorFunction; export function takeWhile(predicate: BooleanConstructor): OperatorFunction extends never ? never : T>; export function takeWhile( predicate: BooleanConstructor,