【问题标题】:Typescript : Can't find module at execution打字稿:执行时找不到模块
【发布时间】:2016-05-24 04:16:07
【问题描述】:

我一直在努力用不同的方式在 Typescript 中制作模块,试图优雅地封装我的代码。但是,我想我对某些事情应该如何工作感到迷茫。

基本上,我正在尝试让两个项目一起工作:

类型定义似乎没问题。问题来自图书馆。因此,我试图将定义保留在名为 riotGamesApi 的模块中,并为库保留另一个名为 riotGamesTypeNode 的模块。我尝试在第二个中导入第一个,并且预编译器没有检测到任何错误。

我还开始为我的库使用 mocha 编写测试。同样,预编译器在我的代码中没有发现任何错误。

这是我目前对模块所做的:

文件riotgamesapi.d.ts(类型定义)

declare module riotGamesApi {
    export module champion {
        [...]
    }
    [some more exports]
}

declare module "riotGamesApi" {
    export = riotGamesApi;
}

文件riotgamesapi-typenode.ts(库)

///<reference path="../lib/riotgamesapi-typedef/riotgamesapi" />
///<reference path="../typings/node/node" />

import * as api from "riotGamesApi";

export module riotGamesTypeNode {
    [some classes here]
}

export = riotGamesTypeNode;

文件 riotgamesapi-typenode-tests.ts(库测试)

///<reference path="../lib/riotgamesapi-typedef/riotgamesapi" />
///<reference path="../src/riotgamesapi-typenode" />

import * as api from 'riotGamesApi';
import * as rtnode from '../src/riotgamesapi-typenode';

[Using rtnode in code]

但是在编译完所有东西后(使用commonjses5 进行gulp),当我尝试运行测试时,遇到了这个错误:

events.js:141
      throw er; // Unhandled 'error' event
      ^
Error: Cannot find module '../src/riotgamesapi-typenode'
    at Function.Module._resolveFilename (module.js:338:15)
    at Function.Module._load (module.js:289:25)
    at Module.require (module.js:366:17)
    at require (module.js:385:17)
    [...more error lines...]

我不明白我在这里做错了什么,因为这似乎是预编译器不会警告我某些事情的唯一方法。我肯定遗漏了一些东西,但预编译器也是如此?

我已链接到完整文件的内容,因此您可以在需要时查找更多信息,或者通过克隆 git 自己尝试。 (我为此使用gulp,测试代码的任务是gulp test

提前感谢您提供的任何建议或解决方案,因为我已经被这个问题困扰了一段时间...... :)

【问题讨论】:

    标签: module typescript require ecmascript-5 commonjs


    【解决方案1】:

    查看您的构建输出目录,那里没有src 目录,因此您的测试中的../src/riotgamesapi-typenode 永远不会解析为riotgamesapi-typenode.js。修复 Gulp 配置以输出预期的目录结构。

    我还应该提到,像在 riotgamesapi-typenode.ts 中那样将命名空间(AKA 内部模块)与外部模块混合通常是一个坏主意,并且不再推荐使用引用路径 cmets(而是在 Gulp 任务中引用它们)。

    【讨论】:

    • 感谢您的回答。我一直在尝试在不使用路径的情况下引用模块,但我无法让它工作。在文件“riotgamesapi-typenode.ts”中,我现在只使用module riotGamesTypeNode 而不是“export”语句。这是正确的方法吗?因为测试文件,即使在使用///&lt;reference path="../src/riotgamesapi-typenode" /&gt; 引用它之后,语句import * as rtnode from 'riotGamesTypeNode'; 仍然找不到模块(在编译时告诉我这个)。你能看到我在这里做错了吗? (我也推送了一个新版本到 git)
    • @Protectator 您正在尝试使用 ES6 样式的 import 语句来导入内部模块,它不是那样工作的,它只适用于外部模块。我已经为您解决了问题并提交了PR,这不一定是最干净的设置方式,但至少现在可以使用,如果需要,您可以对其进行改进。
    • 是的,您所做的更改正在发挥作用。非常感谢您的帮助,我正在研究您是如何做到这一点的 :) 我终于可以按照我最初的计划工作了。
    猜你喜欢
    • 2022-08-19
    • 2021-01-07
    • 2013-12-30
    • 2018-06-27
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多