我有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
包装并解决错误。
是否有预期的行为?当我在同一个文件中但在模块外部定义一个接口时,为什么模块突然“关闭”是没有意义的,特别是如果该模块内部甚至没有使用该接口。
答案 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
}