1

我有 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包装器并解决错误。

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

4

1 回答 1

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      
}
于 2013-01-14T11:39:37.863 回答