Microsoft/TypeScript

'Export as namespace' issue in generating ambient code of same namespace

Open

#47,220 创建于 2021年12月22日

在 GitHub 查看
 (0 评论) (1 反应) (0 负责人)TypeScript (6,726 fork)batch import
BugDomain: JS EmitHelp Wanted

仓库指标

Star
 (48,455 star)
PR 合并指标
 (平均合并 6天 17小时) (30 天内合并 9 个 PR)

描述

Bug Report

When using "export as namespace" feature in a declaration file, the exported classes are working as intended in 'legacy' ambient-style TS code that is still using namespaces, but the emitted .JS code lacks of the namespace in the case of namespace merging.

🔎 Search Terms

namespaces, modules, export as

🕗 Version & Regression Information

Typescript 4.5.4

  • It is replicable on 3.9.7 as well, so it doesn't seems a recent regression.

⏯ Playground Link

Playground link with relevant code

💻 Code

// api.d.ts
export declare class Class1 { }
export as namespace ns;

// test.ts
/// <reference path="./api.d.ts">
const x = new ns.Class1();
// Merging namespaces
namespace ns {
   const x = new Class1();
}

🙁 Actual behavior

The code above compiles without errors. However, the emitted JS is not using the ns object, when augmenting the ns namespace:

const x = new ns.Class1();  // <-- this is correct
var ns;
(function (ns) {
    const x = new Class1();   // <-- Class1 is undefined, ns.Class1 should be used instead
})(ns || (ns = {}));

🙂 Expected behavior

const x = new ns.Class1();
var ns;
(function (ns) {
    const x = new ns.Class1();
})(ns || (ns = {}));

Thanks!

贡献者指南