diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 650bc488b0e..ba866c867e9 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -8392,7 +8392,7 @@ namespace ts { if (needToCaptureLexicalThis) { captureLexicalThis(node, container); } - if (isFunctionLike(container)) { + if (isFunctionLike(container) && !isInParameterInitializerBeforeContainingFunction(node)) { // If this is a function in a JS file, it might be a class method. Check if it's the RHS // of a x.prototype.y = function [name]() { .... } if (container.kind === SyntaxKind.FunctionExpression && diff --git a/tests/baselines/reference/inferParameterWithMethodCallInitializer.js b/tests/baselines/reference/inferParameterWithMethodCallInitializer.js new file mode 100644 index 00000000000..6a5400ca19a --- /dev/null +++ b/tests/baselines/reference/inferParameterWithMethodCallInitializer.js @@ -0,0 +1,30 @@ +//// [inferParameterWithMethodCallInitializer.ts] +function getNumber(): number { + return 1; +} +class Example { + getNumber(): number { + return 1; + } + doSomething(a = this.getNumber()): typeof a { + return a; + } +} + + +//// [inferParameterWithMethodCallInitializer.js] +function getNumber() { + return 1; +} +var Example = (function () { + function Example() { + } + Example.prototype.getNumber = function () { + return 1; + }; + Example.prototype.doSomething = function (a) { + if (a === void 0) { a = this.getNumber(); } + return a; + }; + return Example; +}()); diff --git a/tests/baselines/reference/inferParameterWithMethodCallInitializer.symbols b/tests/baselines/reference/inferParameterWithMethodCallInitializer.symbols new file mode 100644 index 00000000000..e4318fe1ead --- /dev/null +++ b/tests/baselines/reference/inferParameterWithMethodCallInitializer.symbols @@ -0,0 +1,27 @@ +=== tests/cases/compiler/inferParameterWithMethodCallInitializer.ts === +function getNumber(): number { +>getNumber : Symbol(getNumber, Decl(inferParameterWithMethodCallInitializer.ts, 0, 0)) + + return 1; +} +class Example { +>Example : Symbol(Example, Decl(inferParameterWithMethodCallInitializer.ts, 2, 1)) + + getNumber(): number { +>getNumber : Symbol(Example.getNumber, Decl(inferParameterWithMethodCallInitializer.ts, 3, 15)) + + return 1; + } + doSomething(a = this.getNumber()): typeof a { +>doSomething : Symbol(Example.doSomething, Decl(inferParameterWithMethodCallInitializer.ts, 6, 5)) +>a : Symbol(a, Decl(inferParameterWithMethodCallInitializer.ts, 7, 16)) +>this.getNumber : Symbol(Example.getNumber, Decl(inferParameterWithMethodCallInitializer.ts, 3, 15)) +>this : Symbol(Example, Decl(inferParameterWithMethodCallInitializer.ts, 2, 1)) +>getNumber : Symbol(Example.getNumber, Decl(inferParameterWithMethodCallInitializer.ts, 3, 15)) +>a : Symbol(a, Decl(inferParameterWithMethodCallInitializer.ts, 7, 16)) + + return a; +>a : Symbol(a, Decl(inferParameterWithMethodCallInitializer.ts, 7, 16)) + } +} + diff --git a/tests/baselines/reference/inferParameterWithMethodCallInitializer.types b/tests/baselines/reference/inferParameterWithMethodCallInitializer.types new file mode 100644 index 00000000000..53c58e201b7 --- /dev/null +++ b/tests/baselines/reference/inferParameterWithMethodCallInitializer.types @@ -0,0 +1,30 @@ +=== tests/cases/compiler/inferParameterWithMethodCallInitializer.ts === +function getNumber(): number { +>getNumber : () => number + + return 1; +>1 : number +} +class Example { +>Example : Example + + getNumber(): number { +>getNumber : () => number + + return 1; +>1 : number + } + doSomething(a = this.getNumber()): typeof a { +>doSomething : (a?: number) => number +>a : number +>this.getNumber() : number +>this.getNumber : () => number +>this : this +>getNumber : () => number +>a : number + + return a; +>a : number + } +} +