diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index cc3ce1d728a33..0b0668dc5a05e 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -894,8 +894,12 @@ namespace ts { } if ((source.flags | target.flags) & SymbolFlags.JSContainer) { const sourceInitializer = getJSInitializerSymbol(source); - const targetInitializer = getJSInitializerSymbol(target); + let targetInitializer = getJSInitializerSymbol(target); if (sourceInitializer !== source || targetInitializer !== target) { + if (!(targetInitializer.flags & SymbolFlags.Transient)) { + const mergedInitializer = getMergedSymbol(targetInitializer); + targetInitializer = mergedInitializer === targetInitializer ? cloneSymbol(targetInitializer) : mergedInitializer; + } mergeSymbol(targetInitializer, sourceInitializer); } } @@ -18779,7 +18783,7 @@ namespace ts { } const links = getNodeLinks(node); - const type = getTypeOfSymbol(node.symbol); + const type = getTypeOfSymbol(getMergedSymbol(node.symbol)); // Check if function expression is contextually typed and assign parameter types if so. if (!(links.flags & NodeCheckFlags.ContextChecked)) { diff --git a/tests/baselines/reference/typeFromPropertyAssignment10.types b/tests/baselines/reference/typeFromPropertyAssignment10.types index 9dad053c0994e..ed28398d7f790 100644 --- a/tests/baselines/reference/typeFromPropertyAssignment10.types +++ b/tests/baselines/reference/typeFromPropertyAssignment10.types @@ -1,28 +1,28 @@ === tests/cases/conformance/salsa/module.js === var Outer = Outer || {}; ->Outer : typeof __object ->Outer || {} : typeof __object ->Outer : typeof __object ->{} : typeof __object +>Outer : { [x: string]: any; app: { [x: string]: any; SomeView: () => void; Inner: typeof (Anonymous class); statische: (k: number) => number; Application: () => void; }; } +>Outer || {} : { [x: string]: any; app: { [x: string]: any; SomeView: () => void; Inner: typeof (Anonymous class); statische: (k: number) => number; Application: () => void; }; } +>Outer : { [x: string]: any; app: { [x: string]: any; SomeView: () => void; Inner: typeof (Anonymous class); statische: (k: number) => number; Application: () => void; }; } +>{} : { [x: string]: any; app: { [x: string]: any; SomeView: () => void; Inner: typeof (Anonymous class); statische: (k: number) => number; Application: () => void; }; } Outer.app = Outer.app || {}; ->Outer.app = Outer.app || {} : typeof __object ->Outer.app : typeof __object ->Outer : typeof __object ->app : typeof __object ->Outer.app || {} : typeof __object ->Outer.app : typeof __object ->Outer : typeof __object ->app : typeof __object ->{} : typeof __object +>Outer.app = Outer.app || {} : { [x: string]: any; SomeView: () => void; Inner: typeof (Anonymous class); statische: (k: number) => number; Application: () => void; } +>Outer.app : { [x: string]: any; SomeView: () => void; Inner: typeof (Anonymous class); statische: (k: number) => number; Application: () => void; } +>Outer : { [x: string]: any; app: { [x: string]: any; SomeView: () => void; Inner: typeof (Anonymous class); statische: (k: number) => number; Application: () => void; }; } +>app : { [x: string]: any; SomeView: () => void; Inner: typeof (Anonymous class); statische: (k: number) => number; Application: () => void; } +>Outer.app || {} : { [x: string]: any; SomeView: () => void; Inner: typeof (Anonymous class); statische: (k: number) => number; Application: () => void; } +>Outer.app : { [x: string]: any; SomeView: () => void; Inner: typeof (Anonymous class); statische: (k: number) => number; Application: () => void; } +>Outer : { [x: string]: any; app: { [x: string]: any; SomeView: () => void; Inner: typeof (Anonymous class); statische: (k: number) => number; Application: () => void; }; } +>app : { [x: string]: any; SomeView: () => void; Inner: typeof (Anonymous class); statische: (k: number) => number; Application: () => void; } +>{} : { [x: string]: any; SomeView: () => void; Inner: typeof (Anonymous class); statische: (k: number) => number; Application: () => void; } === tests/cases/conformance/salsa/someview.js === Outer.app.SomeView = (function () { >Outer.app.SomeView = (function () { var SomeView = function() { var me = this; } return SomeView;})() : () => void >Outer.app.SomeView : () => void ->Outer.app : typeof __object ->Outer : typeof __object ->app : typeof __object +>Outer.app : { [x: string]: any; SomeView: () => void; Inner: typeof (Anonymous class); statische: (k: number) => number; Application: () => void; } +>Outer : { [x: string]: any; app: { [x: string]: any; SomeView: () => void; Inner: typeof (Anonymous class); statische: (k: number) => number; Application: () => void; }; } +>app : { [x: string]: any; SomeView: () => void; Inner: typeof (Anonymous class); statische: (k: number) => number; Application: () => void; } >SomeView : () => void >(function () { var SomeView = function() { var me = this; } return SomeView;})() : () => void >(function () { var SomeView = function() { var me = this; } return SomeView;}) : () => () => void @@ -43,9 +43,9 @@ Outer.app.SomeView = (function () { Outer.app.Inner = class { >Outer.app.Inner = class { constructor() { /** @type {number} */ this.y = 12; }} : typeof (Anonymous class) >Outer.app.Inner : typeof (Anonymous class) ->Outer.app : typeof __object ->Outer : typeof __object ->app : typeof __object +>Outer.app : { [x: string]: any; SomeView: () => void; Inner: typeof (Anonymous class); statische: (k: number) => number; Application: () => void; } +>Outer : { [x: string]: any; app: { [x: string]: any; SomeView: () => void; Inner: typeof (Anonymous class); statische: (k: number) => number; Application: () => void; }; } +>app : { [x: string]: any; SomeView: () => void; Inner: typeof (Anonymous class); statische: (k: number) => number; Application: () => void; } >Inner : typeof (Anonymous class) >class { constructor() { /** @type {number} */ this.y = 12; }} : typeof (Anonymous class) @@ -63,9 +63,9 @@ var example = new Outer.app.Inner(); >example : (Anonymous class) >new Outer.app.Inner() : (Anonymous class) >Outer.app.Inner : typeof (Anonymous class) ->Outer.app : typeof __object ->Outer : typeof __object ->app : typeof __object +>Outer.app : { [x: string]: any; SomeView: () => void; Inner: typeof (Anonymous class); statische: (k: number) => number; Application: () => void; } +>Outer : { [x: string]: any; app: { [x: string]: any; SomeView: () => void; Inner: typeof (Anonymous class); statische: (k: number) => number; Application: () => void; }; } +>app : { [x: string]: any; SomeView: () => void; Inner: typeof (Anonymous class); statische: (k: number) => number; Application: () => void; } >Inner : typeof (Anonymous class) example.y; @@ -77,9 +77,9 @@ example.y; Outer.app.statische = function (k) { >Outer.app.statische = function (k) { return k ** k;} : (k: number) => number >Outer.app.statische : (k: number) => number ->Outer.app : typeof __object ->Outer : typeof __object ->app : typeof __object +>Outer.app : { [x: string]: any; SomeView: () => void; Inner: typeof (Anonymous class); statische: (k: number) => number; Application: () => void; } +>Outer : { [x: string]: any; app: { [x: string]: any; SomeView: () => void; Inner: typeof (Anonymous class); statische: (k: number) => number; Application: () => void; }; } +>app : { [x: string]: any; SomeView: () => void; Inner: typeof (Anonymous class); statische: (k: number) => number; Application: () => void; } >statische : (k: number) => number >function (k) { return k ** k;} : (k: number) => number >k : number @@ -93,9 +93,9 @@ Outer.app.statische = function (k) { Outer.app.Application = (function () { >Outer.app.Application = (function () { /** * Application main class. * Will be instantiated & initialized by HTML page */ var Application = function () { var me = this; me.view = new Outer.app.SomeView(); }; return Application;})() : () => void >Outer.app.Application : () => void ->Outer.app : typeof __object ->Outer : typeof __object ->app : typeof __object +>Outer.app : { [x: string]: any; SomeView: () => void; Inner: typeof (Anonymous class); statische: (k: number) => number; Application: () => void; } +>Outer : { [x: string]: any; app: { [x: string]: any; SomeView: () => void; Inner: typeof (Anonymous class); statische: (k: number) => number; Application: () => void; }; } +>app : { [x: string]: any; SomeView: () => void; Inner: typeof (Anonymous class); statische: (k: number) => number; Application: () => void; } >Application : () => void >(function () { /** * Application main class. * Will be instantiated & initialized by HTML page */ var Application = function () { var me = this; me.view = new Outer.app.SomeView(); }; return Application;})() : () => void >(function () { /** * Application main class. * Will be instantiated & initialized by HTML page */ var Application = function () { var me = this; me.view = new Outer.app.SomeView(); }; return Application;}) : () => () => void @@ -120,9 +120,9 @@ Outer.app.Application = (function () { >view : any >new Outer.app.SomeView() : any >Outer.app.SomeView : () => void ->Outer.app : typeof __object ->Outer : typeof __object ->app : typeof __object +>Outer.app : { [x: string]: any; SomeView: () => void; Inner: typeof (Anonymous class); statische: (k: number) => number; Application: () => void; } +>Outer : { [x: string]: any; app: { [x: string]: any; SomeView: () => void; Inner: typeof (Anonymous class); statische: (k: number) => number; Application: () => void; }; } +>app : { [x: string]: any; SomeView: () => void; Inner: typeof (Anonymous class); statische: (k: number) => number; Application: () => void; } >SomeView : () => void }; @@ -135,18 +135,18 @@ var app = new Outer.app.Application(); >app : any >new Outer.app.Application() : any >Outer.app.Application : () => void ->Outer.app : typeof __object ->Outer : typeof __object ->app : typeof __object +>Outer.app : { [x: string]: any; SomeView: () => void; Inner: typeof (Anonymous class); statische: (k: number) => number; Application: () => void; } +>Outer : { [x: string]: any; app: { [x: string]: any; SomeView: () => void; Inner: typeof (Anonymous class); statische: (k: number) => number; Application: () => void; }; } +>app : { [x: string]: any; SomeView: () => void; Inner: typeof (Anonymous class); statische: (k: number) => number; Application: () => void; } >Application : () => void var inner = new Outer.app.Inner(); >inner : (Anonymous class) >new Outer.app.Inner() : (Anonymous class) >Outer.app.Inner : typeof (Anonymous class) ->Outer.app : typeof __object ->Outer : typeof __object ->app : typeof __object +>Outer.app : { [x: string]: any; SomeView: () => void; Inner: typeof (Anonymous class); statische: (k: number) => number; Application: () => void; } +>Outer : { [x: string]: any; app: { [x: string]: any; SomeView: () => void; Inner: typeof (Anonymous class); statische: (k: number) => number; Application: () => void; }; } +>app : { [x: string]: any; SomeView: () => void; Inner: typeof (Anonymous class); statische: (k: number) => number; Application: () => void; } >Inner : typeof (Anonymous class) inner.y; @@ -166,9 +166,9 @@ x.y; Outer.app.statische(101); // Infinity, duh >Outer.app.statische(101) : number >Outer.app.statische : (k: number) => number ->Outer.app : typeof __object ->Outer : typeof __object ->app : typeof __object +>Outer.app : { [x: string]: any; SomeView: () => void; Inner: typeof (Anonymous class); statische: (k: number) => number; Application: () => void; } +>Outer : { [x: string]: any; app: { [x: string]: any; SomeView: () => void; Inner: typeof (Anonymous class); statische: (k: number) => number; Application: () => void; }; } +>app : { [x: string]: any; SomeView: () => void; Inner: typeof (Anonymous class); statische: (k: number) => number; Application: () => void; } >statische : (k: number) => number >101 : 101 diff --git a/tests/baselines/reference/typeFromPropertyAssignment14.types b/tests/baselines/reference/typeFromPropertyAssignment14.types index 10a3fa00e3514..cbf8888e378ef 100644 --- a/tests/baselines/reference/typeFromPropertyAssignment14.types +++ b/tests/baselines/reference/typeFromPropertyAssignment14.types @@ -1,13 +1,13 @@ === tests/cases/conformance/salsa/def.js === var Outer = {}; ->Outer : typeof Outer ->{} : typeof Outer +>Outer : { [x: string]: any; Inner: () => void; } +>{} : { [x: string]: any; Inner: () => void; } === tests/cases/conformance/salsa/work.js === Outer.Inner = function () {} >Outer.Inner = function () {} : () => void >Outer.Inner : () => void ->Outer : typeof Outer +>Outer : { [x: string]: any; Inner: () => void; } >Inner : () => void >function () {} : () => void @@ -15,7 +15,7 @@ Outer.Inner.prototype = { >Outer.Inner.prototype = { x: 1, m() { }} : { [x: string]: any; x: number; m(): void; } >Outer.Inner.prototype : any >Outer.Inner : () => void ->Outer : typeof Outer +>Outer : { [x: string]: any; Inner: () => void; } >Inner : () => void >prototype : any >{ x: 1, m() { }} : { [x: string]: any; x: number; m(): void; } @@ -48,7 +48,7 @@ var inno = new Outer.Inner() >inno : { [x: string]: any; x: number; m(): void; } >new Outer.Inner() : { [x: string]: any; x: number; m(): void; } >Outer.Inner : () => void ->Outer : typeof Outer +>Outer : { [x: string]: any; Inner: () => void; } >Inner : () => void inno.x diff --git a/tests/baselines/reference/typeFromPropertyAssignment4.types b/tests/baselines/reference/typeFromPropertyAssignment4.types index 9139ab4c73523..56e8d8a721a26 100644 --- a/tests/baselines/reference/typeFromPropertyAssignment4.types +++ b/tests/baselines/reference/typeFromPropertyAssignment4.types @@ -1,13 +1,13 @@ === tests/cases/conformance/salsa/def.js === var Outer = {}; ->Outer : typeof Outer ->{} : typeof Outer +>Outer : { [x: string]: any; Inner: typeof (Anonymous class); } +>{} : { [x: string]: any; Inner: typeof (Anonymous class); } === tests/cases/conformance/salsa/a.js === Outer.Inner = class { >Outer.Inner = class { constructor() { /** @type {number} */ this.y = 12 }} : typeof (Anonymous class) >Outer.Inner : typeof (Anonymous class) ->Outer : typeof Outer +>Outer : { [x: string]: any; Inner: typeof (Anonymous class); } >Inner : typeof (Anonymous class) >class { constructor() { /** @type {number} */ this.y = 12 }} : typeof (Anonymous class) @@ -35,7 +35,7 @@ var inner = new Outer.Inner() >inner : (Anonymous class) >new Outer.Inner() : (Anonymous class) >Outer.Inner : typeof (Anonymous class) ->Outer : typeof Outer +>Outer : { [x: string]: any; Inner: typeof (Anonymous class); } >Inner : typeof (Anonymous class) inner.y @@ -57,7 +57,7 @@ var z = new Outer.Inner() >z : (Anonymous class) >new Outer.Inner() : (Anonymous class) >Outer.Inner : typeof (Anonymous class) ->Outer : typeof Outer +>Outer : { [x: string]: any; Inner: typeof (Anonymous class); } >Inner : typeof (Anonymous class) z.y