/** * tests of overload selection * * @flow */ var x1: number = "".match(0)[0]; var x2: number = "".match(/pattern/)[0]; var x3: string = "".replace(/pattern/,"..."); var x4: number = "".split(/pattern/)[0]; declare class C { foo(x:number): number; foo(x:string): string; bar(x: { a: number }): number; bar(x: { a: string }): string; } var a = new C(); a.foo(0); // ok a.foo("hey"); // ok a.foo(true); // error, function cannot be called on intersection type a.bar({ a: 0 }); // ok a.bar({ a: "hey" }); // ok a.bar({ a: true }); // error, function cannot be called on intersection type declare var x: { a: boolean; } & { b: string }; a.bar(x); // error with nested intersection info (outer for bar, inner for x) /********** tests ************** interface Dummy { dumb(foo: (x:number) => number):number; dumb(foo: (x:string) => string):string; dumber(bar: (x:T) => Array):U; dumber(bar: (x:T) => U):Array; } function foo(x:string):string { return x; } var y:number = new Dummy().dumb(foo); function bar1(x:number):Array { return []; } var z1:number = new Dummy().dumber(bar1); function bar2(x:number):string { return "..."; } var z2:Array = new Dummy().dumber(bar2); */