gpt4 book ai didi

javascript - Typescript - 无法导入内部模块 - 意外行为

转载 作者:行者123 更新时间:2023-11-30 18:12:12 25 4
gpt4 key购买 nike

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

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,在模块外添加接口(interface)会生成一个 define(["require", "exports"] 包装器,这会在尝试导入 App.Tools 时导致错误.Utils 模块在另一个文件中。删除接口(interface)会删除 define 包装器并解决错误。

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

最佳答案

因为您在界面上使用了 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
}

关于javascript - Typescript - 无法导入内部模块 - 意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14311801/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com