Always consider parameters in scope visible to node builder (#58075)

This commit is contained in:
Wesley Wigham 2024-04-04 13:06:42 -07:00 committed by GitHub
parent 386cc0f417
commit f2bd592838
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 90 additions and 80 deletions

View File

@ -6329,7 +6329,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
if (
entityName.parent.kind === SyntaxKind.TypeQuery ||
entityName.parent.kind === SyntaxKind.ExpressionWithTypeArguments && !isPartOfTypeNode(entityName.parent) ||
entityName.parent.kind === SyntaxKind.ComputedPropertyName
entityName.parent.kind === SyntaxKind.ComputedPropertyName ||
entityName.parent.kind === SyntaxKind.TypePredicate && (entityName.parent as TypePredicateNode).parameterName === entityName
) {
// Typeof value
meaning = SymbolFlags.Value | SymbolFlags.ExportValue;
@ -8672,6 +8673,15 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
const meaning = getMeaningOfEntityNameReference(node);
const sym = resolveEntityName(leftmost, meaning, /*ignoreErrors*/ true, /*dontResolveAlias*/ true);
if (sym) {
// If a parameter is resolvable in the current context it is also visible, so no need to go to symbol accesibility
if (
sym.flags & SymbolFlags.FunctionScopedVariable
&& sym.valueDeclaration
) {
if (isParameterDeclaration(sym.valueDeclaration)) {
return { introducesError, node: attachSymbolToLeftmostIdentifier(node) as T };
}
}
if (
!(sym.flags & SymbolFlags.TypeParameter) && // Type parameters are visible in the curent context if they are are resolvable
!isDeclarationName(node) &&

View File

@ -28,24 +28,24 @@ var out = foo((x, y) => {
> : ^^^^^^^
>foo : { (func: (x: string, y: string) => any): boolean; (func: (x: string, y: number) => any): string; }
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>(x, y) => { function bar(a: typeof x): void; function bar(b: typeof y): void; function bar() { } return bar;} : (x: string, y: string) => { (a: string): void; (b: string): void; }
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^ ^^^
>(x, y) => { function bar(a: typeof x): void; function bar(b: typeof y): void; function bar() { } return bar;} : (x: string, y: string) => { (a: typeof x): void; (b: typeof y): void; }
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^ ^^^^^^ ^^^ ^^^
>x : string
> : ^^^^^^
>y : string
> : ^^^^^^
function bar(a: typeof x): void;
>bar : { (a: string): void; (b: string): void; }
> : ^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^
>bar : { (a: typeof x): void; (b: string): void; }
> : ^^^^^^ ^^^ ^^^^^^^^^^^^^^^^^^^^^^
>a : string
> : ^^^^^^
>x : string
> : ^^^^^^
function bar(b: typeof y): void;
>bar : { (a: string): void; (b: string): void; }
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^
>bar : { (a: string): void; (b: typeof y): void; }
> : ^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^ ^^^
>b : string
> : ^^^^^^
>y : string
@ -88,16 +88,16 @@ var out2 = foo2((x, y) => {
> : ^^^^^^^
>foo2 : { (func: (x: string, y: string) => any): boolean; (func: (x: string, y: number) => any): string; }
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>(x, y) => { var bar: { (a: typeof x): void; (b: typeof y): void; }; return bar;} : (x: string, y: string) => { (a: string): void; (b: string): void; }
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^ ^^^
>(x, y) => { var bar: { (a: typeof x): void; (b: typeof y): void; }; return bar;} : (x: string, y: string) => { (a: typeof x): void; (b: typeof y): void; }
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^ ^^^^^^ ^^^ ^^^
>x : string
> : ^^^^^^
>y : string
> : ^^^^^^
var bar: {
>bar : { (a: string): void; (b: string): void; }
> : ^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^ ^^^
>bar : { (a: typeof x): void; (b: typeof y): void; }
> : ^^^^^^ ^^^ ^^^^^^ ^^^ ^^^
(a: typeof x): void;
>a : string

View File

@ -171,13 +171,13 @@ interface I {
declare function f1({ a: string }: O): void;
declare const f2: ({ a: string }: O) => void;
declare const f3: ({ a: string, b, c }: O) => void;
declare const f4: ({ a: string }: O) => string;
declare const f5: ({ a: string, b, c }: O) => string;
declare const f4: ({ a: string }: O) => typeof string;
declare const f5: ({ a: string, b, c }: O) => typeof string;
declare const obj1: {
method({ a: string }: O): void;
};
declare const obj2: {
method({ a: string }: O): string;
method({ a: string }: O): typeof string;
};
declare function f6({ a: string }: O): void;
declare const f7: ({ a: string, b, c }: O) => void;

View File

@ -325,10 +325,10 @@ const f3 = ({ a: string, b, c }: O) => { };
> : ^^^^^^
const f4 = function({ a: string }: O): typeof string { return string; };
>f4 : ({ a: string }: O) => string
> : ^^^^^^^^^^^^^^^^ ^^^^^^^^^^^
>function({ a: string }: O): typeof string { return string; } : ({ a: string }: O) => string
> : ^^^^^^^^^^^^^^^^ ^^^^^^^^^^^
>f4 : ({ a: string }: O) => typeof string
> : ^^^^^^^^^^^^^^^^ ^^^^^
>function({ a: string }: O): typeof string { return string; } : ({ a: string }: O) => typeof string
> : ^^^^^^^^^^^^^^^^ ^^^^^
>a : any
> : ^^^
>string : string
@ -339,10 +339,10 @@ const f4 = function({ a: string }: O): typeof string { return string; };
> : ^^^^^^
const f5 = ({ a: string, b, c }: O): typeof string => '';
>f5 : ({ a: string, b, c }: O) => string
> : ^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^
>({ a: string, b, c }: O): typeof string => '' : ({ a: string, b, c }: O) => string
> : ^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^
>f5 : ({ a: string, b, c }: O) => typeof string
> : ^^^^^^^^^^^^^^^^^^^^^^ ^^^^^
>({ a: string, b, c }: O): typeof string => '' : ({ a: string, b, c }: O) => typeof string
> : ^^^^^^^^^^^^^^^^^^^^^^ ^^^^^
>a : any
> : ^^^
>string : string
@ -372,14 +372,14 @@ const obj1 = {
};
const obj2 = {
>obj2 : { method({ a: string }: O): string; }
> : ^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^
>{ method({ a: string }: O): typeof string { return string; }} : { method({ a: string }: O): string; }
> : ^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^
>obj2 : { method({ a: string }: O): typeof string; }
> : ^^^^^^^^^^^^^^^^^^^^^^^^ ^^^ ^^^
>{ method({ a: string }: O): typeof string { return string; }} : { method({ a: string }: O): typeof string; }
> : ^^^^^^^^^^^^^^^^^^^^^^^^ ^^^ ^^^
method({ a: string }: O): typeof string { return string; }
>method : ({ a: string }: O) => string
> : ^^^^^^^^^^^^^^^^ ^^^^^^^^^^^
>method : ({ a: string }: O) => typeof string
> : ^^^^^^^^^^^^^^^^ ^^^^^
>a : any
> : ^^^
>string : string

View File

@ -6,8 +6,8 @@ module CallSignature {
> : ^^^^^^^^^^^^^^^^^^^^
declare function foo1(cb: (x: number) => void): typeof cb;
>foo1 : { (cb: (x: number) => void): (x: number) => void; (cb: any): any; }
> : ^^^^^^^ ^^^^^^^ ^^^^^ ^^^^^^^^^^^^^^^^^^^
>foo1 : { (cb: (x: number) => void): typeof cb; (cb: any): any; }
> : ^^^^^^^ ^^^ ^^^^^^^^^^^^^^^^^^^
>cb : (x: number) => void
> : ^^^^ ^^^^^
>x : number
@ -49,8 +49,8 @@ module CallSignature {
> : ^^
declare function foo2(cb: (x: number, y: number) => void): typeof cb;
>foo2 : { (cb: (x: number, y: number) => void): (x: number, y: number) => void; (cb: any): any; }
> : ^^^^^^^ ^^^^^^^ ^^^^^ ^^^^^ ^^^^^^^^^^^^^^^^^^^
>foo2 : { (cb: (x: number, y: number) => void): typeof cb; (cb: any): any; }
> : ^^^^^^^ ^^^ ^^^^^^^^^^^^^^^^^^^
>cb : (x: number, y: number) => void
> : ^^^^ ^^^^^ ^^^^^
>x : number

View File

@ -39,8 +39,8 @@ module Errors {
> : ^^^^^^
declare function foo2(a2: (x: number) => string[]): typeof a2;
>foo2 : { (a2: (x: number) => string[]): (x: number) => string[]; (a2: any): any; }
> : ^^^^^^^ ^^^^^^^ ^^^^^ ^^^^^^^^^^^^^^^^^^^
>foo2 : { (a2: (x: number) => string[]): typeof a2; (a2: any): any; }
> : ^^^^^^^ ^^^ ^^^^^^^^^^^^^^^^^^^
>a2 : (x: number) => string[]
> : ^^^^ ^^^^^
>x : number
@ -54,8 +54,8 @@ module Errors {
>a2 : any
declare function foo7(a2: (x: (arg: Base) => Derived) => (r: Base) => Derived2): typeof a2;
>foo7 : { (a2: (x: (arg: Base) => Derived) => (r: Base) => Derived2): (x: (arg: Base) => Derived) => (r: Base) => Derived2; (a2: any): any; }
> : ^^^^^^^ ^^^^^^^ ^^^^^ ^^^^^^^^^^^^^^^^^^^
>foo7 : { (a2: (x: (arg: Base) => Derived) => (r: Base) => Derived2): typeof a2; (a2: any): any; }
> : ^^^^^^^ ^^^ ^^^^^^^^^^^^^^^^^^^
>a2 : (x: (arg: Base) => Derived) => (r: Base) => Derived2
> : ^^^^ ^^^^^
>x : (arg: Base) => Derived
@ -73,8 +73,8 @@ module Errors {
>a2 : any
declare function foo8(a2: (x: (arg: Base) => Derived, y: (arg2: Base) => Derived) => (r: Base) => Derived): typeof a2;
>foo8 : { (a2: (x: (arg: Base) => Derived, y: (arg2: Base) => Derived) => (r: Base) => Derived): (x: (arg: Base) => Derived, y: (arg2: Base) => Derived) => (r: Base) => Derived; (a2: any): any; }
> : ^^^^^^^ ^^^^^^^ ^^^^^ ^^^^^ ^^^^^^^^^^^^^^^^^^^
>foo8 : { (a2: (x: (arg: Base) => Derived, y: (arg2: Base) => Derived) => (r: Base) => Derived): typeof a2; (a2: any): any; }
> : ^^^^^^^ ^^^ ^^^^^^^^^^^^^^^^^^^
>a2 : (x: (arg: Base) => Derived, y: (arg2: Base) => Derived) => (r: Base) => Derived
> : ^^^^ ^^^^^ ^^^^^
>x : (arg: Base) => Derived
@ -96,8 +96,8 @@ module Errors {
>a2 : any
declare function foo10(a2: (...x: Base[]) => Base): typeof a2;
>foo10 : { (a2: (...x: Base[]) => Base): (...x: Base[]) => Base; (a2: any): any; }
> : ^^^^^^^ ^^^^^^^^^^ ^^^^^ ^^^^^^^^^^^^^^^^^^^
>foo10 : { (a2: (...x: Base[]) => Base): typeof a2; (a2: any): any; }
> : ^^^^^^^ ^^^ ^^^^^^^^^^^^^^^^^^^
>a2 : (...x: Base[]) => Base
> : ^^^^^^^ ^^^^^
>x : Base[]
@ -111,8 +111,8 @@ module Errors {
>a2 : any
declare function foo11(a2: (x: { foo: string }, y: { foo: string; bar: string }) => Base): typeof a2;
>foo11 : { (a2: (x: { foo: string; }, y: { foo: string; bar: string; }) => Base): (x: { foo: string; }, y: { foo: string; bar: string; }) => Base; (a2: any): any; }
> : ^^^^^^^ ^^^^^^^ ^^^^^ ^^^^^ ^^^^^^^^^^^^^^^^^^^
>foo11 : { (a2: (x: { foo: string; }, y: { foo: string; bar: string; }) => Base): typeof a2; (a2: any): any; }
> : ^^^^^^^ ^^^ ^^^^^^^^^^^^^^^^^^^
>a2 : (x: { foo: string; }, y: { foo: string; bar: string; }) => Base
> : ^^^^ ^^^^^ ^^^^^
>x : { foo: string; }
@ -134,8 +134,8 @@ module Errors {
>a2 : any
declare function foo12(a2: (x: Array<Base>, y: Array<Derived2>) => Array<Derived>): typeof a2;
>foo12 : { (a2: (x: Array<Base>, y: Array<Derived2>) => Array<Derived>): (x: Array<Base>, y: Array<Derived2>) => Array<Derived>; (a2: any): any; }
> : ^^^^^^^ ^^^^^^^ ^^^^^ ^^^^^ ^^^^^^^^^^^^^^^^^^^
>foo12 : { (a2: (x: Array<Base>, y: Array<Derived2>) => Array<Derived>): typeof a2; (a2: any): any; }
> : ^^^^^^^ ^^^ ^^^^^^^^^^^^^^^^^^^
>a2 : (x: Array<Base>, y: Array<Derived2>) => Array<Derived>
> : ^^^^ ^^^^^ ^^^^^
>x : Base[]
@ -151,8 +151,8 @@ module Errors {
>a2 : any
declare function foo15(a2: (x: { a: string; b: number }) => number): typeof a2;
>foo15 : { (a2: (x: { a: string; b: number; }) => number): (x: { a: string; b: number; }) => number; (a2: any): any; }
> : ^^^^^^^ ^^^^^^^ ^^^^^ ^^^^^^^^^^^^^^^^^^^
>foo15 : { (a2: (x: { a: string; b: number; }) => number): typeof a2; (a2: any): any; }
> : ^^^^^^^ ^^^ ^^^^^^^^^^^^^^^^^^^
>a2 : (x: { a: string; b: number; }) => number
> : ^^^^ ^^^^^
>x : { a: string; b: number; }
@ -170,8 +170,8 @@ module Errors {
>a2 : any
declare function foo16(a2: {
>foo16 : { (a2: { (x: { (a: number): number; (a?: number): number; }): number[]; (x: { (a: boolean): boolean; (a?: boolean): boolean; }): boolean[]; }): { (x: { (a: number): number; (a?: number): number; }): number[]; (x: { (a: boolean): boolean; (a?: boolean): boolean; }): boolean[]; }; (a2: any): any; }
> : ^^^^^^^ ^^^^^^^^^ ^^^ ^^^^^^ ^^^ ^^^^^^^^^^^^^^^^^^^^^^
>foo16 : { (a2: { (x: { (a: number): number; (a?: number): number; }): number[]; (x: { (a: boolean): boolean; (a?: boolean): boolean; }): boolean[]; }): typeof a2; (a2: any): any; }
> : ^^^^^^^ ^^^ ^^^^^^^^^^^^^^^^^^^
>a2 : { (x: { (a: number): number; (a?: number): number; }): number[]; (x: { (a: boolean): boolean; (a?: boolean): boolean; }): boolean[]; }
> : ^^^^^^ ^^^ ^^^^^^ ^^^ ^^^
@ -212,8 +212,8 @@ module Errors {
>a2 : any
declare function foo17(a2: {
>foo17 : { (a2: { (x: { <T extends Derived>(a: T): T; <T extends Base>(a: T): T; }): any[]; (x: { <T extends Derived2>(a: T): T; <T extends Base>(a: T): T; }): any[]; }): { (x: { <T extends Derived>(a: T): T; <T extends Base>(a: T): T; }): any[]; (x: { <T extends Derived2>(a: T): T; <T extends Base>(a: T): T; }): any[]; }; (a2: any): any; }
> : ^^^^^^^ ^^^^^^^^^ ^^^ ^^^^^^ ^^^ ^^^^^^^^^^^^^^^^^^^^^^
>foo17 : { (a2: { (x: { <T extends Derived>(a: T): T; <T extends Base>(a: T): T; }): any[]; (x: { <T extends Derived2>(a: T): T; <T extends Base>(a: T): T; }): any[]; }): typeof a2; (a2: any): any; }
> : ^^^^^^^ ^^^ ^^^^^^^^^^^^^^^^^^^
>a2 : { (x: { <T extends Derived>(a: T): T; <T extends Base>(a: T): T; }): any[]; (x: { <T extends Derived2>(a: T): T; <T extends Base>(a: T): T; }): any[]; }
> : ^^^^^^ ^^^ ^^^^^^ ^^^ ^^^
@ -748,8 +748,8 @@ module WithGenericSignaturesInBaseType {
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
declare function foo2(a2: <T>(x: T) => T[]): typeof a2;
>foo2 : { (a2: <T>(x: T) => T[]): <T>(x: T) => T[]; (a2: any): any; }
> : ^^^^^^^ ^^^^ ^^^^^ ^^^^^ ^^^^^^^^^^^^^^^^^^^
>foo2 : { (a2: <T>(x: T) => T[]): typeof a2; (a2: any): any; }
> : ^^^^^^^ ^^^ ^^^^^^^^^^^^^^^^^^^
>a2 : <T>(x: T) => T[]
> : ^ ^^^^^ ^^^^^
>x : T
@ -783,8 +783,8 @@ module WithGenericSignaturesInBaseType {
> : ^^^^^^^^^^^^^^^^^^^^^
declare function foo3(a2: <T>(x: T) => string[]): typeof a2;
>foo3 : { (a2: <T>(x: T) => string[]): <T>(x: T) => string[]; (a2: any): any; }
> : ^^^^^^^ ^^^^ ^^^^^ ^^^^^ ^^^^^^^^^^^^^^^^^^^
>foo3 : { (a2: <T>(x: T) => string[]): typeof a2; (a2: any): any; }
> : ^^^^^^^ ^^^ ^^^^^^^^^^^^^^^^^^^
>a2 : <T>(x: T) => string[]
> : ^ ^^^^^ ^^^^^
>x : T

View File

@ -6,8 +6,8 @@ module ConstructSignature {
> : ^^^^^^^^^^^^^^^^^^^^^^^^^
declare function foo1(cb: new (x: number) => void): typeof cb;
>foo1 : { (cb: new (x: number) => void): new (x: number) => void; (cb: any): any; }
> : ^^^^^^^ ^^^^^^^^^^^ ^^^^^ ^^^^^^^^^^^^^^^^^^^
>foo1 : { (cb: new (x: number) => void): typeof cb; (cb: any): any; }
> : ^^^^^^^ ^^^ ^^^^^^^^^^^^^^^^^^^
>cb : new (x: number) => void
> : ^^^^^^^^ ^^^^^
>x : number
@ -53,8 +53,8 @@ module ConstructSignature {
> : ^^^^^^^^^^^^^^^^^^^^^^^
declare function foo2(cb: new (x: number, y: number) => void): typeof cb;
>foo2 : { (cb: new (x: number, y: number) => void): new (x: number, y: number) => void; (cb: any): any; }
> : ^^^^^^^ ^^^^^^^^^^^ ^^^^^ ^^^^^ ^^^^^^^^^^^^^^^^^^^
>foo2 : { (cb: new (x: number, y: number) => void): typeof cb; (cb: any): any; }
> : ^^^^^^^ ^^^ ^^^^^^^^^^^^^^^^^^^
>cb : new (x: number, y: number) => void
> : ^^^^^^^^ ^^^^^ ^^^^^
>x : number

View File

@ -39,8 +39,8 @@ module Errors {
> : ^^^^^^
declare function foo2(a2: new (x: number) => string[]): typeof a2;
>foo2 : { (a2: new (x: number) => string[]): new (x: number) => string[]; (a2: any): any; }
> : ^^^^^^^ ^^^^^^^^^^^ ^^^^^ ^^^^^^^^^^^^^^^^^^^
>foo2 : { (a2: new (x: number) => string[]): typeof a2; (a2: any): any; }
> : ^^^^^^^ ^^^ ^^^^^^^^^^^^^^^^^^^
>a2 : new (x: number) => string[]
> : ^^^^^^^^ ^^^^^
>x : number
@ -54,8 +54,8 @@ module Errors {
>a2 : any
declare function foo7(a2: new (x: new (arg: Base) => Derived) => new (r: Base) => Derived2): typeof a2;
>foo7 : { (a2: new (x: new (arg: Base) => Derived) => new (r: Base) => Derived2): new (x: new (arg: Base) => Derived) => new (r: Base) => Derived2; (a2: any): any; }
> : ^^^^^^^ ^^^^^^^^^^^ ^^^^^ ^^^^^^^^^^^^^^^^^^^
>foo7 : { (a2: new (x: new (arg: Base) => Derived) => new (r: Base) => Derived2): typeof a2; (a2: any): any; }
> : ^^^^^^^ ^^^ ^^^^^^^^^^^^^^^^^^^
>a2 : new (x: new (arg: Base) => Derived) => new (r: Base) => Derived2
> : ^^^^^^^^ ^^^^^
>x : new (arg: Base) => Derived
@ -73,8 +73,8 @@ module Errors {
>a2 : any
declare function foo8(a2: new (x: new (arg: Base) => Derived, y: new (arg2: Base) => Derived) => new (r: Base) => Derived): typeof a2;
>foo8 : { (a2: new (x: new (arg: Base) => Derived, y: new (arg2: Base) => Derived) => new (r: Base) => Derived): new (x: new (arg: Base) => Derived, y: new (arg2: Base) => Derived) => new (r: Base) => Derived; (a2: any): any; }
> : ^^^^^^^ ^^^^^^^^^^^ ^^^^^ ^^^^^ ^^^^^^^^^^^^^^^^^^^
>foo8 : { (a2: new (x: new (arg: Base) => Derived, y: new (arg2: Base) => Derived) => new (r: Base) => Derived): typeof a2; (a2: any): any; }
> : ^^^^^^^ ^^^ ^^^^^^^^^^^^^^^^^^^
>a2 : new (x: new (arg: Base) => Derived, y: new (arg2: Base) => Derived) => new (r: Base) => Derived
> : ^^^^^^^^ ^^^^^ ^^^^^
>x : new (arg: Base) => Derived
@ -96,8 +96,8 @@ module Errors {
>a2 : any
declare function foo10(a2: new (...x: Base[]) => Base): typeof a2;
>foo10 : { (a2: new (...x: Base[]) => Base): new (...x: Base[]) => Base; (a2: any): any; }
> : ^^^^^^^ ^^^^^^^^^^^^^^ ^^^^^ ^^^^^^^^^^^^^^^^^^^
>foo10 : { (a2: new (...x: Base[]) => Base): typeof a2; (a2: any): any; }
> : ^^^^^^^ ^^^ ^^^^^^^^^^^^^^^^^^^
>a2 : new (...x: Base[]) => Base
> : ^^^^^^^^^^^ ^^^^^
>x : Base[]
@ -111,8 +111,8 @@ module Errors {
>a2 : any
declare function foo11(a2: new (x: { foo: string }, y: { foo: string; bar: string }) => Base): typeof a2;
>foo11 : { (a2: new (x: { foo: string; }, y: { foo: string; bar: string; }) => Base): new (x: { foo: string; }, y: { foo: string; bar: string; }) => Base; (a2: any): any; }
> : ^^^^^^^ ^^^^^^^^^^^ ^^^^^ ^^^^^ ^^^^^^^^^^^^^^^^^^^
>foo11 : { (a2: new (x: { foo: string; }, y: { foo: string; bar: string; }) => Base): typeof a2; (a2: any): any; }
> : ^^^^^^^ ^^^ ^^^^^^^^^^^^^^^^^^^
>a2 : new (x: { foo: string; }, y: { foo: string; bar: string; }) => Base
> : ^^^^^^^^ ^^^^^ ^^^^^
>x : { foo: string; }
@ -134,8 +134,8 @@ module Errors {
>a2 : any
declare function foo12(a2: new (x: Array<Base>, y: Array<Derived2>) => Array<Derived>): typeof a2;
>foo12 : { (a2: new (x: Array<Base>, y: Array<Derived2>) => Array<Derived>): new (x: Array<Base>, y: Array<Derived2>) => Array<Derived>; (a2: any): any; }
> : ^^^^^^^ ^^^^^^^^^^^ ^^^^^ ^^^^^ ^^^^^^^^^^^^^^^^^^^
>foo12 : { (a2: new (x: Array<Base>, y: Array<Derived2>) => Array<Derived>): typeof a2; (a2: any): any; }
> : ^^^^^^^ ^^^ ^^^^^^^^^^^^^^^^^^^
>a2 : new (x: Array<Base>, y: Array<Derived2>) => Array<Derived>
> : ^^^^^^^^ ^^^^^ ^^^^^
>x : Base[]
@ -151,8 +151,8 @@ module Errors {
>a2 : any
declare function foo15(a2: new (x: { a: string; b: number }) => number): typeof a2;
>foo15 : { (a2: new (x: { a: string; b: number; }) => number): new (x: { a: string; b: number; }) => number; (a2: any): any; }
> : ^^^^^^^ ^^^^^^^^^^^ ^^^^^ ^^^^^^^^^^^^^^^^^^^
>foo15 : { (a2: new (x: { a: string; b: number; }) => number): typeof a2; (a2: any): any; }
> : ^^^^^^^ ^^^ ^^^^^^^^^^^^^^^^^^^
>a2 : new (x: { a: string; b: number; }) => number
> : ^^^^^^^^ ^^^^^
>x : { a: string; b: number; }
@ -170,8 +170,8 @@ module Errors {
>a2 : any
declare function foo16(a2: {
>foo16 : { (a2: { new (x: { new (a: number): number; new (a?: number): number; }): number[]; new (x: { new (a: boolean): boolean; new (a?: boolean): boolean; }): boolean[]; }): { new (x: { new (a: number): number; new (a?: number): number; }): number[]; new (x: { new (a: boolean): boolean; new (a?: boolean): boolean; }): boolean[]; }; (a2: any): any; }
> : ^^^^^^^ ^^^^^^^^^^^^^ ^^^ ^^^^^^^^^^ ^^^ ^^^^^^^^^^^^^^^^^^^^^^
>foo16 : { (a2: { new (x: { new (a: number): number; new (a?: number): number; }): number[]; new (x: { new (a: boolean): boolean; new (a?: boolean): boolean; }): boolean[]; }): typeof a2; (a2: any): any; }
> : ^^^^^^^ ^^^ ^^^^^^^^^^^^^^^^^^^
>a2 : { new (x: { new (a: number): number; new (a?: number): number; }): number[]; new (x: { new (a: boolean): boolean; new (a?: boolean): boolean; }): boolean[]; }
> : ^^^^^^^^^^ ^^^ ^^^^^^^^^^ ^^^ ^^^
@ -212,8 +212,8 @@ module Errors {
>a2 : any
declare function foo17(a2: {
>foo17 : { (a2: { new (x: { new <T extends Derived>(a: T): T; new <T extends Base>(a: T): T; }): any[]; new (x: { new <T extends Derived2>(a: T): T; new <T extends Base>(a: T): T; }): any[]; }): { new (x: { new <T extends Derived>(a: T): T; new <T extends Base>(a: T): T; }): any[]; new (x: { new <T extends Derived2>(a: T): T; new <T extends Base>(a: T): T; }): any[]; }; (a2: any): any; }
> : ^^^^^^^ ^^^^^^^^^^^^^ ^^^ ^^^^^^^^^^ ^^^ ^^^^^^^^^^^^^^^^^^^^^^
>foo17 : { (a2: { new (x: { new <T extends Derived>(a: T): T; new <T extends Base>(a: T): T; }): any[]; new (x: { new <T extends Derived2>(a: T): T; new <T extends Base>(a: T): T; }): any[]; }): typeof a2; (a2: any): any; }
> : ^^^^^^^ ^^^ ^^^^^^^^^^^^^^^^^^^
>a2 : { new (x: { new <T extends Derived>(a: T): T; new <T extends Base>(a: T): T; }): any[]; new (x: { new <T extends Derived2>(a: T): T; new <T extends Base>(a: T): T; }): any[]; }
> : ^^^^^^^^^^ ^^^ ^^^^^^^^^^ ^^^ ^^^
@ -668,8 +668,8 @@ module WithGenericSignaturesInBaseType {
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
declare function foo2(a2: new <T>(x: T) => T[]): typeof a2;
>foo2 : { (a2: new <T>(x: T) => T[]): new <T>(x: T) => T[]; (a2: any): any; }
> : ^^^^^^^ ^^^^^^^^ ^^^^^ ^^^^^ ^^^^^^^^^^^^^^^^^^^
>foo2 : { (a2: new <T>(x: T) => T[]): typeof a2; (a2: any): any; }
> : ^^^^^^^ ^^^ ^^^^^^^^^^^^^^^^^^^
>a2 : new <T>(x: T) => T[]
> : ^^^^^ ^^^^^ ^^^^^
>x : T
@ -697,8 +697,8 @@ module WithGenericSignaturesInBaseType {
> : ^^^^^^^^^^^^^^^^^^^^^^^^^
declare function foo3(a2: new <T>(x: T) => string[]): typeof a2;
>foo3 : { (a2: new <T>(x: T) => string[]): new <T>(x: T) => string[]; (a2: any): any; }
> : ^^^^^^^ ^^^^^^^^ ^^^^^ ^^^^^ ^^^^^^^^^^^^^^^^^^^
>foo3 : { (a2: new <T>(x: T) => string[]): typeof a2; (a2: any): any; }
> : ^^^^^^^ ^^^ ^^^^^^^^^^^^^^^^^^^
>a2 : new <T>(x: T) => string[]
> : ^^^^^ ^^^^^ ^^^^^
>x : T