TypeScript/tests/baselines/reference/genericCallWithOverloadedConstructorTypedArguments.types
2014-08-15 14:37:48 -07:00

174 lines
5.9 KiB
Plaintext

=== tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithOverloadedConstructorTypedArguments.ts ===
// Function typed arguments with multiple signatures must be passed an implementation that matches all of them
// Inferences are made quadratic-pairwise to and from these overload sets
module NonGenericParameter {
>NonGenericParameter : typeof NonGenericParameter
var a: {
>a : { new (x: boolean): boolean; new (x: string): string; }
new(x: boolean): boolean;
>x : boolean
new(x: string): string;
>x : string
}
function foo4(cb: typeof a) {
>foo4 : (cb: { new (x: boolean): boolean; new (x: string): string; }) => boolean
>cb : { new (x: boolean): boolean; new (x: string): string; }
>a : { new (x: boolean): boolean; new (x: string): string; }
return new cb(null);
>new cb(null) : boolean
>cb : { new (x: boolean): boolean; new (x: string): string; }
}
var r = foo4(a);
>r : boolean
>foo4(a) : boolean
>foo4 : (cb: { new (x: boolean): boolean; new (x: string): string; }) => boolean
>a : { new (x: boolean): boolean; new (x: string): string; }
var b: { new <T>(x: T): T };
>b : new <T>(x: T) => T
>T : T
>x : T
>T : T
>T : T
var r2 = foo4(b);
>r2 : boolean
>foo4(b) : boolean
>foo4 : (cb: { new (x: boolean): boolean; new (x: string): string; }) => boolean
>b : new <T>(x: T) => T
}
module GenericParameter {
>GenericParameter : typeof GenericParameter
function foo5<T>(cb: { new(x: T): string; new(x: number): T }) {
>foo5 : <T>(cb: { new (x: T): string; new (x: number): T; }) => { new (x: T): string; new (x: number): T; }
>T : T
>cb : { new (x: T): string; new (x: number): T; }
>x : T
>T : T
>x : number
>T : T
return cb;
>cb : { new (x: T): string; new (x: number): T; }
}
var a: {
>a : { new (x: boolean): string; new (x: number): boolean; }
new (x: boolean): string;
>x : boolean
new (x: number): boolean;
>x : number
}
var r5 = foo5(a); // new{} => string; new(x:number) => {}
>r5 : { new (x: boolean): string; new (x: number): boolean; }
>foo5(a) : { new (x: boolean): string; new (x: number): boolean; }
>foo5 : <T>(cb: { new (x: T): string; new (x: number): T; }) => { new (x: T): string; new (x: number): T; }
>a : { new (x: boolean): string; new (x: number): boolean; }
var b: { new<T>(x: T): string; new<T>(x: number): T; }
>b : { new <T>(x: T): string; new <T>(x: number): T; }
>T : T
>x : T
>T : T
>T : T
>x : number
>T : T
var r7 = foo5(b); // new any => string; new(x:number) => any
>r7 : { new (x: any): string; new (x: number): any; }
>foo5(b) : { new (x: any): string; new (x: number): any; }
>foo5 : <T>(cb: { new (x: T): string; new (x: number): T; }) => { new (x: T): string; new (x: number): T; }
>b : { new <T>(x: T): string; new <T>(x: number): T; }
function foo6<T>(cb: { new(x: T): string; new(x: T, y?: T): string }) {
>foo6 : <T>(cb: { new (x: T): string; new (x: T, y?: T): string; }) => { new (x: T): string; new (x: T, y?: T): string; }
>T : T
>cb : { new (x: T): string; new (x: T, y?: T): string; }
>x : T
>T : T
>x : T
>T : T
>y : T
>T : T
return cb;
>cb : { new (x: T): string; new (x: T, y?: T): string; }
}
var r8 = foo6(a); // new{} => string; new(x:{}, y?:{}) => string
>r8 : { new (x: {}): string; new (x: {}, y?: {}): string; }
>foo6(a) : { new (x: {}): string; new (x: {}, y?: {}): string; }
>foo6 : <T>(cb: { new (x: T): string; new (x: T, y?: T): string; }) => { new (x: T): string; new (x: T, y?: T): string; }
>a : { new (x: boolean): string; new (x: number): boolean; }
var r9 = foo6(b); // new any => string; new(x:any, y?:any) => string
>r9 : { new (x: any): string; new (x: any, y?: any): string; }
>foo6(b) : { new (x: any): string; new (x: any, y?: any): string; }
>foo6 : <T>(cb: { new (x: T): string; new (x: T, y?: T): string; }) => { new (x: T): string; new (x: T, y?: T): string; }
>b : { new <T>(x: T): string; new <T>(x: number): T; }
function foo7<T>(x:T, cb: { new(x: T): string; new(x: T, y?: T): string }) {
>foo7 : <T>(x: T, cb: { new (x: T): string; new (x: T, y?: T): string; }) => { new (x: T): string; new (x: T, y?: T): string; }
>T : T
>x : T
>T : T
>cb : { new (x: T): string; new (x: T, y?: T): string; }
>x : T
>T : T
>x : T
>T : T
>y : T
>T : T
return cb;
>cb : { new (x: T): string; new (x: T, y?: T): string; }
}
var r13 = foo7(1, b); // new any => string; new(x:any, y?:any) => string
>r13 : { new (x: any): string; new (x: any, y?: any): string; }
>foo7(1, b) : { new (x: any): string; new (x: any, y?: any): string; }
>foo7 : <T>(x: T, cb: { new (x: T): string; new (x: T, y?: T): string; }) => { new (x: T): string; new (x: T, y?: T): string; }
>b : { new <T>(x: T): string; new <T>(x: number): T; }
var c: { new <T>(x: T): string; <T>(x: number): T; }
>c : { <T>(x: number): T; new <T>(x: T): string; }
>T : T
>x : T
>T : T
>T : T
>x : number
>T : T
var c2: { new <T>(x: T): string; new<T>(x: number): T; }
>c2 : { new <T>(x: T): string; new <T>(x: number): T; }
>T : T
>x : T
>T : T
>T : T
>x : number
>T : T
var r14 = foo7(1, c); // new any => string; new(x:any, y?:any) => string
>r14 : { new (x: any): string; new (x: any, y?: any): string; }
>foo7(1, c) : { new (x: any): string; new (x: any, y?: any): string; }
>foo7 : <T>(x: T, cb: { new (x: T): string; new (x: T, y?: T): string; }) => { new (x: T): string; new (x: T, y?: T): string; }
>c : { <T>(x: number): T; new <T>(x: T): string; }
var r15 = foo7(1, c2); // new any => string; new(x:any, y?:any) => string
>r15 : { new (x: any): string; new (x: any, y?: any): string; }
>foo7(1, c2) : { new (x: any): string; new (x: any, y?: any): string; }
>foo7 : <T>(x: T, cb: { new (x: T): string; new (x: T, y?: T): string; }) => { new (x: T): string; new (x: T, y?: T): string; }
>c2 : { new <T>(x: T): string; new <T>(x: number): T; }
}