2016-02-12 232 views
0

我一直在努力使用Typescript中的不同方法来创建模块,试图优雅地封装我的代码。但是,我认为我迷失于一些事情应该如何运作。Typescript:在执行时找不到模块

本质上讲,我试图让两个项目一起工作:

类型定义似乎没问题。图书馆出现问题。所以我试图将这些定义保存在一个名为riotGamesApi的模块中,另一个模块名为riotGamesTypeNode。我尝试在第二个导入第一个,并且预编译器没有检测到任何错误。

我也开始使用摩卡书写我的图书馆的测试。同样,预编译器在我的代码中没有发现任何错误。

以下是我目前在做与模块:

文件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有一整套),当我尝试运行测试编译后的一切,遇到这样的错误:

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

非常感谢您提供任何建议或解决方案,因为我一直坚持这一段时间。 .. :)

回答

1

看看你的编译输出目录,那里没有src dir,所以在你的测试中../src/riotgamesapi-typenode永远不会解析为riotgamesapi-typenode.js。修复你的Gulp配置以输出预期的目录结构。

我还要提到的是混合外部模块命名空间(AKA内部模块),你在riotgamesapi-typenode.ts做通常是一个坏主意,并使用参考路径评论不再是一个推荐的做法(引用它们在咕嘟咕嘟的任务,而不是) 。

+0

谢谢你的回答。我一直在尝试引用模块而不使用路径,但我无法设法使其工作。在文件“riotgamesapi-typenode.ts”中,我现在只使用了“module riotGamesTypeNode”而不是“export”语句。这是做到这一点的正确方法吗?因为测试文件,即使在使用'/// '引用它之后,'从'riotGamesTypeNode'导入*为rtnode的语句;'仍然找不到该模块(在编译时告诉我这一点)。那么你能看到我在这里做错了吗? (我已经推出了一个新版本git) –

+1

@Protectator你正在尝试使用ES6风格的导入语句来导入一个内部模块,它不能像那样工作,它只能用于外部模块。我已经为你解决了问题并提交了一个[PR](https://github.com/Protectator/riotgamesapi-typenode/pull/2),但这不一定是最简单的方法,但至少它现在工作,如果需要的话,你可以改进。 –

+0

是的,你所做的改变正在发挥作用。非常感谢你的帮助,我正在研究你是如何做到这一点的:)我终于可以按照我最初的计划工作。 –

相关问题