【问题标题】:Import shared/partial module into another file将共享/部分模块导入另一个文件
【发布时间】:2015-12-10 16:33:00
【问题描述】:

假设我有两个文件:

box.ts:

export module Entities {
    export class Box  { .. Stuff }

origin.ts:

export module Entities {
    export class Origin  { .. other stuff }

据我了解 javascript,这两个模块应该合并为一个模块,其中包含我的两个类。(出于组织原因,我只想将它们放在单独的文件中,但 box 和 origin 都是实体。)

所以现在我有一个需要同时使用这两个的文件:

service-actions.ts:

import {Entities} from '../entities/box';
import {Entities} from '../entities/origin';

... stuff that uses both of those entities.

这给了我错误:

重复标识符“实体”;

如果我有一个或另一个,它工作正常,但都失败了。

有没有办法可以将这些组合起来,以便在我的 service-action.ts 文件中执行 Entities.BoxEntities.Origin

这样做的唯一方法是将BoxOrigin 放在同一个文件中吗?

【问题讨论】:

    标签: javascript import module typescript


    【解决方案1】:

    不要将命名空间(内部模块)与外部模块混用。请参阅 this postthis question 和其他人了解反对混合的论点。我发现最好不要完全使用内部模块。我们没有从命名空间中获得任何封装好处。相反,目录是组织代码的一种简单而可靠的方式,而且您已经在使用它们了。

    entities/box.ts:

    export class Box  { .. Stuff }
    

    entities/origin.ts:

    export class Origin  { .. other stuff }
    

    现在您不必编写 Entities.Box,只需导入 Box 并使用它:

    import { Box } from '../entities/box';
    import { Origin } from '../entities/origin';
    

    【讨论】:

    • 强调的好点。我扫了一眼他使用export module的部分,只看了错误。
    • 我要学习很多类,比如 box 和 origin。我希望将它们组合成一个命名空间。 (我尝试使用内部模块并遇到了这个问题:stackoverflow.com/q/34207865/16241
    • @Vaccano 创建一个entities.ts 文件并从那里重新导出所有命名空间。然后你只需要在你的其他代码中导入那个entities.ts 文件。
    • @Vaccano 将它们合并到一个目录中。将您的目录视为您的“命名空间”。所以不是Foo.Bar.Box,而是"../foo/bar/box",甚至"../foo-bar/box"。这将为您省去很多麻烦。 (我对重新导出有点警惕,导入冗长并不是最糟糕的,但是多个导入来源给我带来了问题。)
    • @Vaccano 是的,听起来不错。如果您在文件中写入export class Foo,它将是一个外部模块。 (此外,您最终会遇到推送 export default 的帖子 - 对它们持保留态度。这种语法对于所有像 $ 这样的旧式 js 模块都很好,但它实际上甚至强制使用别名类,这意味着当你重构时,类名不会在默认导入中更新。)
    【解决方案2】:

    使用as:

    import {Entities as BoxEntities} from './../entities/box';
    import {Entities as OriginEntities} from './../entities/origin';
    
    // Use BoxEntities and OriginEntities here
    

    最好,如果您实际上是按照应有的方式直接从文件中导出类(并且正如 mk 所指出的那样),您可以创建一个 entities.ts 文件来为您处理它:

    export * from './entities/box';
    export * from './entities/origin';
    

    然后导入这个文件:

    import * as Entities from './../entities';
    
    // use Entities.Box and Entities.Origin here
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-09
      相关资源
      最近更新 更多