Fix merging of JS value & TS type decl

Fixes #38383
This commit is contained in:
Eli Barzilay 2020-06-04 16:06:41 -04:00
parent 077a2a9c94
commit 4ee013d1a7
4 changed files with 53 additions and 1 deletions

View File

@ -7870,7 +7870,7 @@ namespace ts {
(resolvedSymbol || symbol).exports!.forEach((s, name) => {
const exportedMember = members.get(name)!;
if (exportedMember && exportedMember !== s) {
if (s.flags & SymbolFlags.Value) {
if (s.flags & SymbolFlags.Value && exportedMember.flags & SymbolFlags.Value) {
// If the member has an additional value-like declaration, union the types from the two declarations,
// but issue an error if they occurred in two different files. The purpose is to support a JS file with
// a pattern like:

View File

@ -0,0 +1,19 @@
=== /x.js ===
module.exports.x = 1;
>module.exports.x : Symbol(x, Decl(x.js, 0, 0), Decl(y.d.ts, 0, 0))
>module.exports : Symbol(x, Decl(x.js, 0, 0), Decl(y.d.ts, 0, 0))
>module : Symbol(module, Decl(x.js, 0, 0))
>exports : Symbol("/x", Decl(x.js, 0, 0))
>x : Symbol(x, Decl(x.js, 0, 0), Decl(y.d.ts, 0, 0))
module.exports = require("./y.js");
>module.exports : Symbol("/x", Decl(x.js, 0, 0))
>module : Symbol(export=, Decl(x.js, 0, 21))
>exports : Symbol(export=, Decl(x.js, 0, 21))
>require : Symbol(require)
>"./y.js" : Symbol("/y", Decl(y.d.ts, 0, 0))
=== /y.d.ts ===
export declare type x = 1;
>x : Symbol(x, Decl(x.js, 0, 0), Decl(y.d.ts, 0, 0))

View File

@ -0,0 +1,23 @@
=== /x.js ===
module.exports.x = 1;
>module.exports.x = 1 : 1
>module.exports.x : number
>module.exports : typeof import("/y")
>module : { "\"/x\"": typeof import("/y"); }
>exports : typeof import("/y")
>x : number
>1 : 1
module.exports = require("./y.js");
>module.exports = require("./y.js") : typeof import("/y")
>module.exports : typeof import("/y")
>module : { "\"/x\"": typeof import("/y"); }
>exports : typeof import("/y")
>require("./y.js") : typeof import("/y")
>require : any
>"./y.js" : "./y.js"
=== /y.d.ts ===
export declare type x = 1;
>x : 1

View File

@ -0,0 +1,10 @@
// @allowJs: true
// @checkJs: true
// @noEmit: true
// @Filename: /x.js
module.exports.x = 1;
module.exports = require("./y.js");
// @Filename: /y.d.ts
export declare type x = 1;