打字稿:执行时找不到模块
Typescript : Can't find module at execution
我一直在努力尝试用不同的方式在 Typescript 中制作模块,试图优雅地封装我的代码。但是,我想我对某些事情应该如何工作感到迷茫。
本质上,我试图让两个项目一起工作:
- API (https://github.com/Protectator/riotgamesapi-typedef)
操作的类型定义
- Node.js 中的库使用这些定义进行调用(https://github.com/Protectator/riotgamesapi-typenode)
类型定义似乎没问题。问题来自图书馆。所以我试图将定义保留在一个名为 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]
但是在编译所有内容之后(gulp 使用 commonjs
和 es5
),当我尝试 运行 测试时,遇到了这个错误:
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
)
提前感谢您提出的任何建议或解决方案,因为我已经坚持了一段时间了...:)
查看您的构建输出目录,其中没有 src
目录,因此您的测试中的 ../src/riotgamesapi-typenode
永远不会解析为 riotgamesapi-typenode.js
。修复您的 Gulp 配置以输出预期的目录结构。
我还应该提一下,像在 riotgamesapi-typenode.ts
中那样将命名空间(又名内部模块)与外部模块混合通常不是一个好主意,并且不再推荐使用引用路径注释(在您的 Gulp 任务)。
我一直在努力尝试用不同的方式在 Typescript 中制作模块,试图优雅地封装我的代码。但是,我想我对某些事情应该如何工作感到迷茫。
本质上,我试图让两个项目一起工作:
- API (https://github.com/Protectator/riotgamesapi-typedef) 操作的类型定义
- Node.js 中的库使用这些定义进行调用(https://github.com/Protectator/riotgamesapi-typenode)
类型定义似乎没问题。问题来自图书馆。所以我试图将定义保留在一个名为 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]
但是在编译所有内容之后(gulp 使用 commonjs
和 es5
),当我尝试 运行 测试时,遇到了这个错误:
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
)
提前感谢您提出的任何建议或解决方案,因为我已经坚持了一段时间了...:)
查看您的构建输出目录,其中没有 src
目录,因此您的测试中的 ../src/riotgamesapi-typenode
永远不会解析为 riotgamesapi-typenode.js
。修复您的 Gulp 配置以输出预期的目录结构。
我还应该提一下,像在 riotgamesapi-typenode.ts
中那样将命名空间(又名内部模块)与外部模块混合通常不是一个好主意,并且不再推荐使用引用路径注释(在您的 Gulp 任务)。