如果所有的导入都来自我自己的文件,我是否需要使用 TypeScript 3.8的“ import type”特性?

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

export interface MyInterface {
// ...
}


export const enum MyEnum {
// ...
}


export type MyType = {
// ...
}

我已经阅读了关于 import type的最新打字稿 给你的新特性。据我所知,它是为了解决具体的问题,似乎主要发生在进口时,从。JS 文件。

我可以用 importimport type语句导入我的类型。这两种方法似乎都同样有效。问题是,我是应该更喜欢 import type,因为它更加明确,能够帮助我避免一些理论上的边缘问题,还是仅仅为了简单起见而使用 import,并依靠 import elision从编译的代码中删除这些问题?

换句话说: 在这里使用 import type有什么好处吗? 或者应该在特定的情况下使用它来解决 import elision的缺点?

56823 次浏览

简短的回答: 通过使用 import typeexport type语句更加明确,似乎可以通过 防范边界问题通过类型定义分析,为提高加工性能和可靠性提供了更好的基础产生明显的好处。

长话短说:

正如 TypeScript 3.8版本说明所言:

import type只导入用于类型注释和声明的声明。类似地,导出类型只提供一个可用于类型上下文的导出,并且也从 TypeScript 的输出中删除。

下面是两个实际示例,说明这些残余导入如何在构建或运行时中导致错误:

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

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

对于那些使用预构建 Babel 预设置的设置: Babel 的团队建议配置 Babel 预设置,以便使用显式的只输入。

阅读更多博客文章: Babel 7.9降低捆绑包大小,增加 TypeScript 3.8支持

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

详细了解使用 isolatedModulesTS 编译器选项的好处以及如何使用 只进行类型导入ーー有利于 Babel 用户的一个新的 TypeScript 特性