【问题标题】:typescript: using declaration files in a typescript project to expose types globallytypescript:在 typescript 项目中使用声明文件来全局公开类型
【发布时间】:2020-11-22 19:06:56
【问题描述】:

我最近开始使用打字稿。 我有一个打字稿项目设置,其中有很多用打字稿编写的 React 组件。 这些 typescript 组件通常会导出组件本身,为了方便开发,我已经将这个 typescript 组件所需的所有类型提取到一个单独的文件中。现在通常你必须在你的组件中导入这些类型才能使用它,但由于它很麻烦,团队中的一些人想出了一个想法,将这些包含类型的单独文件命名为types.d.ts(或任何.d.ts )。这使得类型在整个项目中全局可用,无需在任何地方显式导入类型。

现在,我知道类型声明文件仅在我在我的 typescript 项目中使用 javascript 组件的情况下才需要,并且如果我想对该 javascript 组件进行类型检查。在这种情况下,我可以从外部获取类型声明文件(例如,DefiniteTyped),或者我可以创建一个本地声明文件。 这不是我在这里使用声明文件的目的。

但我想了解这种用法​​有什么问题?

  • 全局公开所有类型是不是错了(请注意,这些类型中的大多数只是组件内部需要,其他使用该组件的组件只需要一些类型)?
  • 编译器或打字稿设置是否会因此而出现问题?
  • 我已阅读有关生成声明文件的编译器选项的信息,此设置会对此产生干扰吗?

注意:这个名为 d.ts 的单独文件并不真正遵循声明文件可能需要的任何特定准则。这只是有一些常规的接口声明

【问题讨论】:

    标签: javascript reactjs typescript


    【解决方案1】:

    一些观察:

    • .ts 文件(或d.ts 文件)中,如果没有顶级导出,它将被视为全局脚本(类似于在 javascript 中的工作方式)并且脚本中的所有内容都可用全球范围内。在我的情况下,这就是全局公开类型的方式(同样,它不必是 .d.ts 文件)

    • 如果ts 文件和d.ts 文件同名,编译器会忽略d.ts 文件,这就是为什么不能使用Component.tsx 公开类型Component.d.ts(您需要将 d.ts 文件命名为其他名称)

    • 当导入没有类型信息的外部模块时,typescript 建议使用declare module moduleName 添加一个d.ts 文件,而不是这个,您也可以在moduleName/index.d.ts 中添加一个具有顶级导出的常规.d.ts 文件

    所以,回答我的问题:

    • 公开应用程序中全局使用的所有类型可能没有错,但是您必须注意任何命名空间/命名冲突。在这种情况下,不需要使用d.ts 文件,此设置与.ts 文件在全局公开类型时一样有效。 实现此目的的另一种方法是从各个文件中导出类型并在需要的地方导入它们。

    • 在此设置中,编译器可能出现的唯一问题是.d.ts 文件与.ts 文件命名相同,在这种情况下.ts 文件将被覆盖,.d.ts 的类型将无法在全球范围内使用。

    • 编译器从ts 文件生成声明文件,如果您需要发布您的类型,这通常是必需的。在我们的例子中,类型是内部的,我们真的不需要生成声明。正如所讨论的,我们的用法不依赖于作为声明文件的文件,它在.ts 文件中同样有效,我们不应该为此使用.d.ts 文件。所以,不,不会有任何影响。

    【讨论】:

      猜你喜欢
      • 2020-05-15
      • 1970-01-01
      • 1970-01-01
      • 2017-06-06
      • 2015-07-25
      • 1970-01-01
      • 2019-03-08
      • 2017-07-25
      • 2022-01-15
      相关资源
      最近更新 更多