diff --git a/tests/baselines/reference/observableInferenceCanBeMade.js b/tests/baselines/reference/observableInferenceCanBeMade.js new file mode 100644 index 00000000000..9014ebd6ca3 --- /dev/null +++ b/tests/baselines/reference/observableInferenceCanBeMade.js @@ -0,0 +1,29 @@ +//// [observableInferenceCanBeMade.ts] +// Repro from #33131 + +declare function of(a: T): Observable; +declare function from>(input: O): Observable>; + +type ObservedValueOf = O extends ObservableInput ? T : never; + +interface Subscribable { + subscribe(next?: (value: T) => void, error?: (error: any) => void, complete?: () => void): void; +} +type ObservableInput = Subscribable | Subscribable; + + +declare class Observable implements Subscribable { + subscribe(next?: (value: T) => void, error?: (error: any) => void, complete?: () => void): void; +} + +function asObservable(input: string | ObservableInput): Observable { + return typeof input === 'string' ? of(input) : from(input) +} + + +//// [observableInferenceCanBeMade.js] +"use strict"; +// Repro from #33131 +function asObservable(input) { + return typeof input === 'string' ? of(input) : from(input); +} diff --git a/tests/baselines/reference/observableInferenceCanBeMade.symbols b/tests/baselines/reference/observableInferenceCanBeMade.symbols new file mode 100644 index 00000000000..0948c5e10ab --- /dev/null +++ b/tests/baselines/reference/observableInferenceCanBeMade.symbols @@ -0,0 +1,80 @@ +=== tests/cases/compiler/observableInferenceCanBeMade.ts === +// Repro from #33131 + +declare function of(a: T): Observable; +>of : Symbol(of, Decl(observableInferenceCanBeMade.ts, 0, 0)) +>T : Symbol(T, Decl(observableInferenceCanBeMade.ts, 2, 20)) +>a : Symbol(a, Decl(observableInferenceCanBeMade.ts, 2, 23)) +>T : Symbol(T, Decl(observableInferenceCanBeMade.ts, 2, 20)) +>Observable : Symbol(Observable, Decl(observableInferenceCanBeMade.ts, 10, 64)) +>T : Symbol(T, Decl(observableInferenceCanBeMade.ts, 2, 20)) + +declare function from>(input: O): Observable>; +>from : Symbol(from, Decl(observableInferenceCanBeMade.ts, 2, 44)) +>O : Symbol(O, Decl(observableInferenceCanBeMade.ts, 3, 22)) +>ObservableInput : Symbol(ObservableInput, Decl(observableInferenceCanBeMade.ts, 9, 1)) +>input : Symbol(input, Decl(observableInferenceCanBeMade.ts, 3, 54)) +>O : Symbol(O, Decl(observableInferenceCanBeMade.ts, 3, 22)) +>Observable : Symbol(Observable, Decl(observableInferenceCanBeMade.ts, 10, 64)) +>ObservedValueOf : Symbol(ObservedValueOf, Decl(observableInferenceCanBeMade.ts, 3, 96)) +>O : Symbol(O, Decl(observableInferenceCanBeMade.ts, 3, 22)) + +type ObservedValueOf = O extends ObservableInput ? T : never; +>ObservedValueOf : Symbol(ObservedValueOf, Decl(observableInferenceCanBeMade.ts, 3, 96)) +>O : Symbol(O, Decl(observableInferenceCanBeMade.ts, 5, 21)) +>O : Symbol(O, Decl(observableInferenceCanBeMade.ts, 5, 21)) +>ObservableInput : Symbol(ObservableInput, Decl(observableInferenceCanBeMade.ts, 9, 1)) +>T : Symbol(T, Decl(observableInferenceCanBeMade.ts, 5, 57)) +>T : Symbol(T, Decl(observableInferenceCanBeMade.ts, 5, 57)) + +interface Subscribable { +>Subscribable : Symbol(Subscribable, Decl(observableInferenceCanBeMade.ts, 5, 73)) +>T : Symbol(T, Decl(observableInferenceCanBeMade.ts, 7, 23)) + + subscribe(next?: (value: T) => void, error?: (error: any) => void, complete?: () => void): void; +>subscribe : Symbol(Subscribable.subscribe, Decl(observableInferenceCanBeMade.ts, 7, 27)) +>next : Symbol(next, Decl(observableInferenceCanBeMade.ts, 8, 14)) +>value : Symbol(value, Decl(observableInferenceCanBeMade.ts, 8, 22)) +>T : Symbol(T, Decl(observableInferenceCanBeMade.ts, 7, 23)) +>error : Symbol(error, Decl(observableInferenceCanBeMade.ts, 8, 40)) +>error : Symbol(error, Decl(observableInferenceCanBeMade.ts, 8, 50)) +>complete : Symbol(complete, Decl(observableInferenceCanBeMade.ts, 8, 70)) +} +type ObservableInput = Subscribable | Subscribable; +>ObservableInput : Symbol(ObservableInput, Decl(observableInferenceCanBeMade.ts, 9, 1)) +>T : Symbol(T, Decl(observableInferenceCanBeMade.ts, 10, 21)) +>Subscribable : Symbol(Subscribable, Decl(observableInferenceCanBeMade.ts, 5, 73)) +>T : Symbol(T, Decl(observableInferenceCanBeMade.ts, 10, 21)) +>Subscribable : Symbol(Subscribable, Decl(observableInferenceCanBeMade.ts, 5, 73)) + + +declare class Observable implements Subscribable { +>Observable : Symbol(Observable, Decl(observableInferenceCanBeMade.ts, 10, 64)) +>T : Symbol(T, Decl(observableInferenceCanBeMade.ts, 13, 25)) +>Subscribable : Symbol(Subscribable, Decl(observableInferenceCanBeMade.ts, 5, 73)) +>T : Symbol(T, Decl(observableInferenceCanBeMade.ts, 13, 25)) + + subscribe(next?: (value: T) => void, error?: (error: any) => void, complete?: () => void): void; +>subscribe : Symbol(Observable.subscribe, Decl(observableInferenceCanBeMade.ts, 13, 56)) +>next : Symbol(next, Decl(observableInferenceCanBeMade.ts, 14, 14)) +>value : Symbol(value, Decl(observableInferenceCanBeMade.ts, 14, 22)) +>T : Symbol(T, Decl(observableInferenceCanBeMade.ts, 13, 25)) +>error : Symbol(error, Decl(observableInferenceCanBeMade.ts, 14, 40)) +>error : Symbol(error, Decl(observableInferenceCanBeMade.ts, 14, 50)) +>complete : Symbol(complete, Decl(observableInferenceCanBeMade.ts, 14, 70)) +} + +function asObservable(input: string | ObservableInput): Observable { +>asObservable : Symbol(asObservable, Decl(observableInferenceCanBeMade.ts, 15, 1)) +>input : Symbol(input, Decl(observableInferenceCanBeMade.ts, 17, 22)) +>ObservableInput : Symbol(ObservableInput, Decl(observableInferenceCanBeMade.ts, 9, 1)) +>Observable : Symbol(Observable, Decl(observableInferenceCanBeMade.ts, 10, 64)) + + return typeof input === 'string' ? of(input) : from(input) +>input : Symbol(input, Decl(observableInferenceCanBeMade.ts, 17, 22)) +>of : Symbol(of, Decl(observableInferenceCanBeMade.ts, 0, 0)) +>input : Symbol(input, Decl(observableInferenceCanBeMade.ts, 17, 22)) +>from : Symbol(from, Decl(observableInferenceCanBeMade.ts, 2, 44)) +>input : Symbol(input, Decl(observableInferenceCanBeMade.ts, 17, 22)) +} + diff --git a/tests/baselines/reference/observableInferenceCanBeMade.types b/tests/baselines/reference/observableInferenceCanBeMade.types new file mode 100644 index 00000000000..bb855f80524 --- /dev/null +++ b/tests/baselines/reference/observableInferenceCanBeMade.types @@ -0,0 +1,57 @@ +=== tests/cases/compiler/observableInferenceCanBeMade.ts === +// Repro from #33131 + +declare function of(a: T): Observable; +>of : (a: T) => Observable +>a : T + +declare function from>(input: O): Observable>; +>from : >(input: O) => Observable> +>input : O + +type ObservedValueOf = O extends ObservableInput ? T : never; +>ObservedValueOf : ObservedValueOf + +interface Subscribable { + subscribe(next?: (value: T) => void, error?: (error: any) => void, complete?: () => void): void; +>subscribe : (next?: ((value: T) => void) | undefined, error?: ((error: any) => void) | undefined, complete?: (() => void) | undefined) => void +>next : ((value: T) => void) | undefined +>value : T +>error : ((error: any) => void) | undefined +>error : any +>complete : (() => void) | undefined +} +type ObservableInput = Subscribable | Subscribable; +>ObservableInput : ObservableInput + + +declare class Observable implements Subscribable { +>Observable : Observable + + subscribe(next?: (value: T) => void, error?: (error: any) => void, complete?: () => void): void; +>subscribe : (next?: ((value: T) => void) | undefined, error?: ((error: any) => void) | undefined, complete?: (() => void) | undefined) => void +>next : ((value: T) => void) | undefined +>value : T +>error : ((error: any) => void) | undefined +>error : any +>complete : (() => void) | undefined +} + +function asObservable(input: string | ObservableInput): Observable { +>asObservable : (input: string | Subscribable | Subscribable) => Observable +>input : string | Subscribable | Subscribable + + return typeof input === 'string' ? of(input) : from(input) +>typeof input === 'string' ? of(input) : from(input) : Observable +>typeof input === 'string' : boolean +>typeof input : "string" | "number" | "bigint" | "boolean" | "symbol" | "undefined" | "object" | "function" +>input : string | Subscribable | Subscribable +>'string' : "string" +>of(input) : Observable +>of : (a: T) => Observable +>input : string +>from(input) : Observable +>from : >(input: O) => Observable> +>input : ObservableInput +} +