打字稿 - 无法导入内部模块 - 意外行为

时间:2013-01-14 02:58:40

标签: javascript typescript

我有2个模块分布在2个文件中:

- App.Tools.Utils.ts

export interface ILogger {
    log: (msg: string) => void;
}

module App.Tools.Utils {     


    export class Logger implements ILogger { ... }

    export function someFunction(){ ... }
}

然后在第二个文件中导入模块:

- App.Routers.ts

 /// <reference path="App.Tools.Utils.ts" />
 module App.Routers { 

    import Utils = App.Tools.Utils;  //ERROR: A module cannot be aliased to a non-module type        

}

我最终发现解决方案是将ILogger接口移到App.Tools.Utils模块中以解决错误。起初它有一定道理,我认为编译器不会让我导入模块,因为Logger类实现了一个未包含在模块中的接口。为了测试,我在模块内部移动了ILogger接口(错误已解决),但随后在模块外部添加了一个任意接口(模块内部或任何地方未使用的接口),并且错误返回..

export interface INeverUsed { } //generates same error

module App.Tools.Utils {     

    export interface ILogger {
       log: (msg: string) => void;
    }

    export class Logger implements ILogger { ... }

    export function someFunction(){ ... }
}

查看生成的JS,在模块外部添加接口会生成define(["require", "exports"]包装,并在尝试导入另一个文件中的App.Tools.Utils模块时导致错误。删除接口将删除define包装并解决错误。

是否有预期的行为?当我在同一个文件中但在模块外部定义一个接口时,为什么模块突然“关闭”是没有意义的,特别是如果该模块内部甚至没有使用该接口。

1 个答案:

答案 0 :(得分:2)

因为您在界面上使用export关键字,所以编译器将文件视为模块。

如果删除界面上的export关键字,它应该有效:

interface ILogger {
    log: (msg: string) => void;
}

module App.Tools.Utils {     
    export class Logger implements ILogger { 
        log(msg: string) { }
    }

    export function someFunction(){  }
}

///<reference path="game.ts" />

module App.Routers { 
    import Utils = App.Tools.Utils; // works      
}