【问题标题】:Exposing external module TypeScript declarations to consuming modules将外部模块 TypeScript 声明暴露给消费模块
【发布时间】:2019-06-25 13:20:03
【问题描述】:

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

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

这些声明文件在shared-stuff 的上下文中工作正常。但是,一旦消费应用程序开始从 shared-stuff 导入,TypeScript 会给我如下错误:

找不到模块“another-thing”的声明文件。

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

有没有办法让消费模块“继承”依赖项的声明?

【问题讨论】:

    标签: typescript node-modules typescript-declarations


    【解决方案1】:

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

    一种方法是在您的index.ts 中使用/// <reference>(并记住在您的分发中包含您的/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 编写的,因此库作者可能会在不知情的情况下意外破坏类型。

    因此,虽然与重用类型相比,自己声明类型听起来很脆弱,但实际上并非如此。 (在您的情况下,无论如何您都是自己定义它们)。

    只要确保你有一套好的测试来捕捉任何类型破坏性的变化。

    【讨论】:

    • /// <reference path="..."/> cmets 添加到主脚本中效果很好。谢谢!
    【解决方案2】:

    有没有办法让消费模块“继承”依赖项的声明?

    传统的方法是将其作为peerDepenency 并在您的文档中提及它需要使用,例如对于react

    npm i shared-lib react @types/react
    

    也就是你带来了自己的react / @types/react

    【讨论】:

    • 我的问题是关于不在可安装@types 模块中的声明,而是在shared-stuff 本地的.d.ts 文件中声明的声明。
    • 将它们作为可安装模块提供?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-07
    • 2021-09-18
    • 2015-08-11
    • 1970-01-01
    • 2017-10-17
    相关资源
    最近更新 更多