我有一个已发布的TypeScript模块(我们将其称为shared-stuff
),该模块旨在由其他TypeScript模块导入。该shared-stuff
模块具有第三方依赖性,这些第三方依赖性没有@types
范围的声明,因此该模块内部有多个声明文件:
/lib/declarations/
something.d.ts
another-thing.d.ts
这些声明文件在shared-stuff
的上下文中可以正常工作。但是,一旦使用方应用开始从shared-stuff
导入,TypeScript就会给我类似以下错误:
找不到模块“其他”的声明文件。
我可以通过让使用者从依赖项中显式导入.d.ts
文件来解决此挑战,但这并不理想,因为每个使用者都必须做同样的事情。
有没有办法让使用模块“继承”依赖项中的声明?
答案 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
版本