命名空间上的打字稿概念

时间:2018-01-20 15:33:57

标签: typescript typescript2.0

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

但是在typescript中,我不能将命名空间放入多个文件中,并将它们全部导入。例如:

spaceConverter.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();

我只想在打字稿中做正确的形式。

谢谢

2 个答案:

答案 0 :(得分:1)

当您不使用模块(导出/导入)时,

名称空间非常有用。它允许不使用大量函数污染全局范围,并防止覆盖全局范围中的现有代码。

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

// 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()

答案 1 :(得分:1)

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

来自Typescript documentation

  

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();