命名空间上的打字稿概念



我对打字稿命名空间的概念有点困惑。来自Java,我想命名空间跨越多个文件,并将它们分组到一个命名空间中。

但是在打字稿中,我不能将命名空间放入超过 1 个文件中,并将它们全部导入。 例如:

空间转换器.ts

export namespace MySpace {
export class SpaceConverter1 {
}
}

timeConverter.ts

export namespace MySpace {
export class TimeConverter1 {
}
}

然后,如果我像导入它们一样

import { MySpace } from './space';
import { MySpace } from './time';

我会得到一个错误作为重复的标识符,这很明显, 但如果我把它说成

export * from './space';
export * from './time';

我会得到MySpace已经导出了。

我的目标其实很简单。 我有多个类,我想将它们放入"MySpace"组中,并让应用程序使用一个名称导入所有类,例如:

import { MySpace } from './myNameSpace';
var space = new MySpace.SpaceConverter1();
var time = new MySpace.TimeConverter1();

我只想要在打字稿中执行此操作的正确形式。

谢谢

命名空间在不使用模块(导出/导入)时很有用。它允许不会用许多函数污染全局范围,并防止覆盖全局范围内的现有代码。

模块已隔离,因此它们不会与其他代码冲突。因此,模块中不需要命名空间。相反,您可以只导出类和函数。如果要将多个模块分组为一个模块,可以创建一个导出所有其他模块的新模块。下面是一个示例:

// spaceConverter.ts
export class SpaceConverter1 {
}
// timeConverter.ts
export class TimeConverter1 {
}
// MySpace.ts
export * from './spaceConverter';
export * from './timeConverter';
// main.ts
import * as MySpace from './MySpace';
let converter = new MySpace.SpaceConverter1()

你真的不需要命名空间,因为模型本身提供了逻辑分组。

从打字稿文档:

TypeScript 中模块的一个关键特性是两个不同的模块 永远不会向同一范围贡献名称。因为消费者 模块决定分配什么名称,无需 主动将导出的符号包装在命名空间中。

为了重申为什么你不应该尝试对模块内容进行命名空间, 命名空间的一般思想是提供逻辑分组 构造并防止名称冲突。因为模块文件 本身已经是一个逻辑分组,它的顶级名称是 由导入它的代码定义,无需使用 导出对象的附加模块层

从模块声明文件中删除命名空间并简化使用者代码中的代码。示例代码:

import { SpaceConverter1 } from './space';
import { TimeConverter1 } from './time';
var space = new SpaceConverter1();
var time = new TimeConverter1();

您还可以如上所述在使用者类中重命名模块。 例子:

重命名导入

import { SpaceConverter1 as SC} from "./space";
let converter = new SC();

在一个变量中导入整个模块

import * as SC from './space';
let converter = new SC.SpaceConverter1();

最新更新