如果我的所有导入都来自我自己的文件,我是否需要使用 TypeScript 3.8 的“导入类型”功能?

Ily*_*dik 30 import module typescript elision typescript3.8

我有一个types.ts定义一些类型的简单文件:

export interface MyInterface {
   // ...
}

export const enum MyEnum {
   // ...
}

export type MyType = {
  // ...
}
Run Code Online (Sandbox Code Playgroud)

我看了一下新功能,import type最新的打字稿这里。据我所知,它旨在解决从 .js 文件导入时似乎主要发生的特定问题。

我可以使用importandimport type语句导入我的类型。两者似乎工作得同样好。问题是我应该更愿意import type更明确地帮助我避免一些理论上的边缘问题,还是我可以只是import为了简单而使用并依赖于import elision从编译的代码中删除这些问题?

换句话说:在这里使用有什么好处,import type还是应该用于特定情况以解决import elision缺点?

ux.*_*eer 26

简短回答:通过使用import typeandexport type语句更加明确似乎可以通过防止边缘情况问题产生可解释的好处,并为当前和即将推出的工具提供更好的基础,以通过类型定义分析提高处理性能和可靠性

长答案:

正如TypeScript 3.8 发行说明所说:

import type仅导入用于类型注释和声明的声明。它总是会被完全擦除,因此在运行时不会有任何残留。同样,导出类型仅提供可用于类型上下文的导出,并且也会从 TypeScript 的输出中删除。

以下是两个实际示例,这些剩余导入如何在构建或运行时导致错误:

另一个好处与分析类型定义的工具有关。目前有关于使用 Babel 设置打包器的好处的详细信息,但目前或以后可能也会使其他工具受益(例如 IDE 性能)。

对于 Babel 用户手动配置他们的设置:如果您在捆绑器设置中使用 Babel 7.9=> 和 TS 3.8=>,那么您可以删除以前需要的@babel/plugin-transform-typescript插件。

对于那些使用预先构建的 Babel 预设的设置:Babel 的团队建议配置 Babel 预设,以便使用明确的仅类型导入。

在博客文章中阅读更多内容:Babel 7.9 减少了包大小,添加了 TypeScript 3.8 支持

更多关于在 TS 文档中使用 Babel 和 TypeScript的相关信息。

详细了解使用isolatedModulesTS 编译器选项的好处以及仅类型导入的工作原理- 一项新的 TypeScript 功能,使 Babel 用户受益

  • 但是 TypeScript 在运行时不应该不存在吗?根据我的理解,即使是“import”也会在运行时被完全删除。 (8认同)
  • @Chen Ni - 你所写的形式的 TypeScript 在运行时并不“存在”,但它并不会完全消失。它被转换为 JavaScript,因此您在 TypeScript 中编写的内容会直接影响 JavaScript 的输出。根据您的 JS 目标,您的“import”语句甚至可能不会与 TS 版本发生太大变化。 (7认同)