如何在AMD模块中使用打字稿内部模块

时间:2015-09-29 18:18:28

标签: typescript amd webpack

我不确定我是否错误地构建了我的打字稿,所以可能会在这里提出错误的问题。

我在同一个文件夹中的不同文件中有2个相关的类1个接口。

我已将它们包装在一个模块中,因为这感觉就像我应该从C#中做的那样。

这是所有的角度,所以它自己的DI可能很重要,但可能不是。

文件1:

export module Module1{
    export interface IService{
    }
}

文件2:

export module Module1{
    export class Implementation implements IInterface{
    ...
    }
}

文件3是使用IInterface的角度注入实例的角度代码。如果我使用require("./File2")导入File2它可以正常工作,但我宁愿导入整个Module1,如下所示,所以我不必单独要求每个类(因为这是显然是一个简化的案例)。

import authModule = require('Module1');

var assetStreamApp = angular.module("[])
    .run(['IInterface'], (instance: IInterface) => {
        instance.doSomething();
    });

这可能吗?

我不想单独导入每个文件,然后为每个"模块"选择一个不同的别名。当我觉得我应该能够做到这一点时命名类型。

编辑:经过多一点阅读后,我想我已经制定了一些术语。我想在项目中使用typescript内部模块,但也使用AMD模块作为分裂点,因此我可以使用webpack的代码拆分。

1 个答案:

答案 0 :(得分:4)

理想情况下,您应该只使用外部模块,而不是将内部模块与外部模块混合使用。

详细讨论了herehere

我建议做... IService.ts:

interface IService {
}

export = IService;

Implementation.ts:

import IInterface = require("./IInterface");

class Implementation implements IInterface{
...
}

export = Implementation;

然后将它们适当地导入到您的文件中:

import IService = require("./IService");
import Implementation = require("./Implementation");

// use IService and Implementation here

将多个模块合并为一个模块

话虽如此,如果您真的想要,可以使用上面的IService.tsImplementation.ts,然后创建一个名为Module1.ts的文件,然后导入您的模块,如下所示:< / p>

export import IService = require("./IService");
export import Implementation = require("./Implementation");

然后在您的代码中,您可以像这样使用它:

import Module1 = require("./Module1");

// use Module1.IService or Module1.Implementation here

将多个模块与ES6模块组合

顺便说一句,我想指出,如果你使用ES6模块,这样做非常方便......

IService.ts:

interface IService {
}

export default IService;

Implementation.ts:

import IInterface from "./IInterface";

export default class Implementation implements IInterface {
...
}

Module1.ts:

// re-export the modules
export {default as IService} from "./IService";
export {default as Implementation} from "./Implementation";

然后,当您使用此模块时,您可以轻松访问您想要的内容。以下是一些示例导入语句:

// import only IService
import {IService} from "./Module1";
// import IService and Implementation
import {IService, Implementation} from "./Module1";
// or implement everything on a Module1 object
import * as Module1 from "./Module1";