typescript - 如果我所有的导入都来自我自己的文件,我是否需要使用 TypeScript 3.8 的“导入类型”功能?
问题描述
我有一个简单的文件types.ts
,它定义了一些类型:
export interface MyInterface {
// ...
}
export const enum MyEnum {
// ...
}
export type MyType = {
// ...
}
我在这里import type
阅读了最新打字稿的新功能。据我了解,它旨在解决从 .js 文件导入时似乎主要发生的特定问题。
我可以使用import
andimport type
语句导入我的类型。两者似乎都工作得很好。问题是我应该更喜欢import type
更明确并帮助我避免一些理论上的边缘情况问题,还是我可以import
为了简单起见并依赖于import elision
从编译代码中删除这些问题?
换句话说:在import type
这里使用有什么好处,还是应该将其用于特定情况以解决import elision
缺点?
解决方案
简短的回答:通过使用import type
和export type
语句更明确似乎可以通过防止边缘情况问题产生可解释的好处,并为当前和即将推出的工具提供更好的基础,以通过类型定义分析提高处理性能和可靠性。
长答案:
正如TypeScript 3.8 发行说明所说:
import type
仅导入用于类型注释和声明的声明。它总是被完全擦除,因此在运行时没有任何残留。同样,导出类型仅提供可用于类型上下文的导出,并且也会从 TypeScript 的输出中删除。
以下是两个实际示例,这些残余导入如何导致构建或运行时错误:
- 由语句修复的奇怪的类型相关 Webpack 错误
import type
,博客文章: Leveraging Type-Only imports and exports with TypeScript 3.8 - 关于剩余导入导致循环依赖引用错误的 SO 问题
另一个好处与分析类型定义的工具有关。目前有关于使用 Babel 的捆绑器设置的好处的详细信息,但目前或以后可能也有利于其他工具(如 IDE 性能)。
对于 Babel 用户手动配置他们的设置:如果您在捆绑器设置中使用 Babel 7.9=> 和 TS 3.8=>,那么您可以删除以前需要的@babel/plugin-transform-typescript
插件。
对于那些使用预先构建的 Babel 预设的设置:Babel 的团队建议配置 Babel 预设,以便使用显式的仅类型导入。
在博客文章中阅读更多内容:Babel 7.9 减少了 Bundle 大小,添加了 TypeScript 3.8 支持。
更多关于在 TS 文档中使用 Babel 和 TypeScript的相关信息。
详细了解使用和isolatedModules
TS 编译器选项如何工作的好处type-only imports — 一项使 Babel 用户受益的新 TypeScript 功能