TypeScript `export as namespace` 不支持嵌套命名空间,

92vpleto  于 2个月前  发布在  TypeScript
关注(0)|答案(5)|浏览(54)

我正在使用Rollup从我的TypeScript源代码生成UMD模块。它是更大产品的一部分,因此一个组件导出到根命名空间(例如 mylib ),另一个导出到该命名空间下的嵌套命名空间(例如 mylib.plugins.myplugin )。Rollup正在生成必要的UMD逻辑,从全局范围向下遍历并在需要时创建命名空间,但我无法在我的TypeScript d.ts 文件中建模这一点。
在第一个情况下,export as namespace 语法运行得很好,但在第二个情况下不行。看起来TypeScript不支持为此目的的嵌套命名空间。这是设计还是遗漏?

TypeScript版本: 2.7.0-dev.20180103
代码:两个文件,一个包含 export as namespace foo.bar 声明和引用它的脚本的 d.ts

  • declaration.d.ts*
export var baz;

export as namespace foo.bar;
  • app.ts*
console.log(foo.bar.baz);

使用以下命令编译:tsc .\test.d.ts .\main.ts

**预期行为:**文件正确编译为以下JS:

console.log(foo.bar.baz);

**实际行为:**错误

declaration.d.ts(3,24): error TS1005: ';' expected.

如果我将 declaration.d.ts 更改为使用 export as namespace foo (并根据需要更新 app.ts ),则编译成功。

sd2nnvve

sd2nnvve1#

同样的问题 - 尝试增强angular-translate。
它在这种情况下可以工作:

import * as moment from 'moment';
export as namespace moment;
export = moment;

然而,对于angular-translate来说,没有可行的解决方案来将其导出为命名空间 angular.translate

ruyhziif

ruyhziif2#

是否有推荐的解决方法?

iyfamqjs

iyfamqjs3#

你应该可以使用模块增强来代替。例如,如果你想要创建 angular.translate ,那么:

import * as ng from "angular";
namespace translateInternal {
   // ...
}
export { translateInternal as translate };
declare module "angular" {
    export import translate = translateInternal;
}
gc0ot86w

gc0ot86w4#

我的临时解决方法是

// SDK.ts
export class SDK {}
export interface SDKOptions {}

// globals.d.ts
import * as sdk from "./SDK";
export as namespace Vendor;
export {sdk}

结果是 Vendor.sdk.SDK ,这是我通过Webpack构建的。在 SDK.ts 中写入 export as namespace Vendor.sdk 会更好。

6vl6ewon

6vl6ewon5#

我的临时解决方案是

// SDK.ts
export class SDK {}
export interface SDKOptions {}

// globals.d.ts
import * as sdk from "./SDK";
export as namespace Vendor;
export {sdk}

结果是 Vendor.sdk.SDK ,这是我通过Webpack构建的。在 SDK.ts 中写入 export as namespace Vendor.sdk 会更好。
关于这个问题:

// SDK.ts
export class SDK {}
export interface SDKOptions {}
 
// index.ts
import * as _sdk from "./SDK";

export namespace Vendor {
    export import sdk = _sdk;
}

在这种情况下,您可以避免将其设置为全局变量,而是在正常的ES6导入之后使用它。

相关问题