代码之家  ›  专栏  ›  技术社区  ›  Magician

命名空间上的Typescript概念

  •  -1
  • Magician  · 技术社区  · 6 年前

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

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

    spaceConverter。ts

    export namespace MySpace {
        export class SpaceConverter1 {
    
        }
    }
    

    时间转换器。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();
    

    我只想在Typescript中使用正确的格式。

    非常感谢。

    2 回复  |  直到 6 年前
        1
  •  1
  •   meziantou    6 年前

    当您不使用模块(导出/导入)时,名称空间很有用。它允许使用大量函数不污染全局范围,并防止覆盖全局范围中的现有代码。

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

    // 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()
    
        2
  •  1
  •   Chirag Rupani    6 年前

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

    从…起 Typescript documentation :

    TypeScript中模块的一个关键特性是两个不同的模块 不会将名称贡献给同一作用域。因为消费者 模块决定分配给它的名称,无需 主动将导出的符号包装到命名空间中。

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

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

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

    您还可以如上所述在consumer类中重命名模块。 示例:

    重命名导入

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

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

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