将外部模块TypeScript声明暴露给使用模块

时间:2019-02-01 00:55:58

标签: typescript node-modules typescript-declarations

我有一个已发布的TypeScript模块(我们将其称为shared-stuff),该模块旨在由其他TypeScript模块导入。该shared-stuff模块具有第三方依赖性,这些第三方依赖性没有@types范围的声明,因此该模块内部有多个声明文件:

/lib/declarations/
  something.d.ts
  another-thing.d.ts

这些声明文件在shared-stuff的上下文中可以正常工作。但是,一旦使用方应用开始从shared-stuff导入,TypeScript就会给我类似以下错误:

  

找不到模块“其他”的声明文件。

我可以通过让使用者从依赖项中显式导入.d.ts文件来解决此挑战,但这并不理想,因为每个使用者都必须做同样的事情。

有没有办法让使用模块“继承”依赖项中的声明?

2 个答案:

答案 0 :(得分:0)

由于您的消费者(shared-stuff的消费者)依赖于another-thing的类型,因此您也需要导出它们。

一种方法是在您的/// <reference>中使用index.ts(并记住在您的发行版中包含/lib/declarations

另一种方法是不依赖外部类型。即,而不是这样做:

import { SomeType } from 'another-thing'
export function foo(): SomeType { ... }

自己定义该类型(在shared-stuff内部,而不是another-thing.d.ts中)

export type SomeType = { ... }
export function foo(): SomeType { ... }

从理论上讲,another-thing中的类型应遵循语义版本,就像库本身一样,但实际上它更容易破坏更改。

一个原因是库不是一开始就用TypeScript编写的,所以库作者可能会不小心破坏类型而没有意识到。

因此,尽管声明自己的类型与重用类型相比听起来很脆弱,但实际上并非如此。 (而且,您还是要自己定义它们)。

只需确保您有一套不错的测试套件即可捕获任何类型突破的更改。

答案 1 :(得分:-1)

  

有没有办法让使用模块“继承”依赖项中的声明?

常规方法是将其作为peerDepenency,并在您的文档中提及使用它所必需的内容,例如为react

npm i shared-lib react @types/react

又带来了自己的react / @types/react版本