为什么在泄漏传递实现类型时,tsc会给出如此神秘的错误?

时间:2016-08-24 19:12:56

标签: node.js typescript typescript-typings

我有一个节点模块A,取决于另一个节点模块B,都是用Typescript编写的。模块B将Promises返回给A并选择bluebird作为Promise实现。 B当然有蓝鸟的打字。

但是,如果A没有bluebird的类型(在我的情况下可能不应该这样),我会收到如下错误:

~/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是否有可能针对这些情况发出更好的错误消息?

小更新: 当我&#m;"泄漏"本地定义的类型直接在B中捕获:

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

interface Completion {
}
  

[TS]   财产'完成'导出的界面已经或正在使用私人名称'完成'。   界面完成

我希望能够直接捕捉到这种事情,如果我从像Bluebird' .Promise这样的依赖中暴露某些东西。我从来没有打算揭露蓝鸟'作为一种传递依赖,我老实说甚至不知道如何用打字来做到这一点?因此,这种情况很好,所发生的事情是“蓝鸟”#39;默默地成为一种典型的同伴依赖"在npm toungue。

1 个答案:

答案 0 :(得分:1)

如果包对另一个模块具有类型依赖性,则该依赖项应包含在包typings.json中,typings install bluebird --save

模块B的类型声明应该类似于type declaration for redux-persist(但在实际项目中)。它depends on redux for several types。因此,有dependency listed in the typings.json

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