==== tests/cases/conformance/types/witness/witness.ts (8 errors) ==== // Initializers var varInit = varInit; // any var pInit: any; function fn(pInit = pInit) { ~~~~~ !!! Parameter 'pInit' cannot be referenced in its initializer. var pInit: any; } class InitClass { x = this.x; fn() { var y = this.x; var y: any; } } // Return type function fnReturn1() { return fnReturn1(); } var a: any; var a = fnReturn1(); function fnReturn2() { return fnReturn2; } var fnr2: () => any = fnReturn2(); // Comma var co1 = (co1, 3); var co1: number; ~~~ !!! Subsequent variable declarations must have the same type. Variable 'co1' must be of type 'any', but here has type 'number'. var co2 = (3, 4, co2); var co2: any; var co3 = (co1, co2, co3, co1); var co3: number; ~~~ !!! Subsequent variable declarations must have the same type. Variable 'co3' must be of type 'any', but here has type 'number'. // Assignment var as1 = (as1 = 2); var as1: number; ~~~ !!! Subsequent variable declarations must have the same type. Variable 'as1' must be of type 'any', but here has type 'number'. var as2 = (as2 = as2 = 2); var as2: number; ~~~ !!! Subsequent variable declarations must have the same type. Variable 'as2' must be of type 'any', but here has type 'number'. // Conditional var cnd1 = cnd1 ? 0 : 1; var cnd1: number; ~~~~ !!! Subsequent variable declarations must have the same type. Variable 'cnd1' must be of type 'any', but here has type 'number'. var cnd2 = cnd1 ? cnd1 ? '' : "" : ''; var cnd2: string; // || var or1 = or1 || ''; var or1: any; var or2 = '' || or2; var or2: any; var or3 = or3 || or3; var or3: any; // && var and1 = and1 && ''; var and1: string; ~~~~ !!! Subsequent variable declarations must have the same type. Variable 'and1' must be of type 'any', but here has type 'string'. var and2 = '' && and2; var and2: any; var and3 = and3 && and3; var and3: any; // function call return type function fnCall() { return fnCall(); } var fnCallResult = fnCall(); var fnCallResult: any; // Call argument function fnArg1(x: typeof fnArg1, y: number) { var x: (n: typeof fnArg1, m: number) => void; fnArg1(fnArg1, 0); } function overload1(x: (n: string) => string): string; function overload1(x: (n: number) => number): number; function overload1(x: (n: any) => any): any; function overload1() { return undefined; }; function fnArg2() { return overload1(fnArg2); } var t = fnArg2(); // t: should be 'any', but is 'string' // New operator class C { fn1() { return new (this.fn1())(); } fn2() { return new (this.fn2()); } fn3() { var a: new(x) => number; return new a(this.fn3); } } function fn5() { var a: new (x) => number; return new a(fn5); } var fn5r = fn5(); // fn5r: should be 'any', but is 'number' // Property access var propAcc1 = { m: propAcc1.m }; var propAcc1: { m: any; } ~~~~~~~~ !!! Subsequent variable declarations must have the same type. Variable 'propAcc1' must be of type 'any', but here has type '{ m: any; }'. // Property access of module member module M2 { export var x = M2.x; var y = x; var y: any; } // Property access of class instance type class C2 { n = this.n; // n: any } var c2inst = new C2().n; var c2inst: any; // Constructor function property access class C3 { static q = C3.q; } var qq = C3.q; var qq: any; // Parentheses - tested a bunch above