2016-08-24 26 views
2

我有一个节点模块A,这取决于另一个节点模块B,它们都是用Typescript编写的。模块B将Promise返回给A,并选择了蓝鸟作为Promise实现。 B当然有蓝鸟的类型。为什么在泄漏传递式实现类型时,tsc会给出如此神秘的错误?

但是,如果没有蓝鸟的分型(它可能不应该在我的情况),我得到这样的错误:

~/d/p/ensime-vscode ❯❯❯ tsc -p .                                        ⏎ master ✭ ✱ 
node_modules/ensime-client/**/file-utils.d.ts(1,26): 
error TS2307: Cannot find module 'bluebird'. 

我花了一段时间来实现,这是由于对我泄漏具体的Promise类型的蓝鸟。将所有公共返回类型更改为PromiseLike使错误消失。

我的问题是,有没有办法在我的独立模块B上检测这些?我记得有时在模块泄漏之前没有公开的类型时会出错,但在这种情况下,模块B构建得很好。这对我来说都很模糊,因为我对Typescript很陌生。我认为Typescript是一种与我习惯的不同的野兽。

另外,是否有可能为这些情况下tsc发出更好的错误消息?

小更新: 当我“泄漏”是本地定义,这是在乙直接夹类型:

export interface CompletionsResponse extends Typehinted { 
    completions: [Completion] 
} 

interface Completion { 
} 

[TS] 住宅“完井”的出口接口具有或正在使用专用名称“完成”。 接口完成

我想能够直接赶上这种事情,如果我从像“bluebird'.Promise的依赖暴露的东西为好。我从来没有打算将“蓝鸟”暴露为传递依赖,而我实际上甚至不知道如何通过类型来做到这一点?因此,这样做很好,发生的事情是,'蓝鸟'在npm toungue中默默地成为了类似的“同伴依赖”。

+0

泄漏类型究竟意味着什么? –

+0

正是我在全文中描述的。我从bluebird泄漏Promise,并从一个没有蓝鸟类型的依赖者那里得到这些错误.Promise。在泄露我的意思是,这不是故意的 - 我应该从一开始就将公共API键入PromiseLike/Thenable,但我认为我需要一个更好的方法来捕捉这些tsc在dependee上编译错误。 –

+0

纠正我,如果我理解错误:你有一个模块A,这取决于模块B,通过模块B Promise类型获取。例如。因为B声明文件指定'B.awesomeFunction()'返回一个(Bluebird)Promise?如果是这样的话,你确定模块B正确地处理它的类型依赖关系吗? –

回答

1

如果某个程序包对另一个模块具有类型依赖关系,则该依赖关系应该包含​​在程序包的typings.jsontypings install bluebird --save中。

您的模块B的类型声明应该看起来像这样type declaration for redux-persist(但在您的实际项目中)。它depends on redux for several types。因此,有一个dependency listed in the typings.json

关于打字稿错误消息,它们是一种痛苦。 ¯\_(ツ)_/¯

+0

哦,好吧,我想我正在做一些非常错误的事情。我没有单独发布我的模块B的类型,而是与该模块一起发布。模块B在typings.json中列出了蓝鸟,但模块A甚至没有typings.json。这是一个vscode扩展... –

+0

此外,我不会想要将蓝鸟的类型暴露给模块A,所以我不认为这是我的问题的答案。你的例子看起来就像我的模块'B':https://github.com/ensime/ensime-node/blob/master/typings.json#L4 –

+0

另外,在模块'A'中安装typings并没有帮助。同样的问题。 –

相关问题