Short answer: Being more explicit by using import type
and export type
statements seem to yield explicable benefits by safeguarding against edge-case problems, as well as giving current and upcoming tooling better ground for improving processing performance and reliability with type definition analysis.
Long answer:
As TypeScript 3.8 release notes say:
import type
only imports declarations to be used for type annotations and declarations. It always gets fully erased, so there’s no remnant of it at runtime. Similarly, export type only provides an export that can be used for type contexts, and is also erased from TypeScript’s output.
Here are two practical examples how these remnant imports can cause errors in build or runtime:
- Strange type-related Webpack error fixed by
import type
statement, a blog post: Leveraging Type-Only imports and exports with TypeScript 3.8 - An SO question about remnant imports causing circular dependency reference errors
Another benefit relates to tooling that is analyzing type definitions. Currently there are details about benefits with bundler setups using Babel, but may currently or later benefit other tooling as well (like IDE performance).
For Babel users manually configuring their setup: If you are using Babel 7.9=> in your bundler setup with TS 3.8=>, then you can possibly remove the previously needed @babel/plugin-transform-typescript
plugin.
For those setups that are using pre-built Babel presets: Babel’s team is recommending of configuring Babel presets so that explicit type-only imports are to be used.
Read more in a blog post: Babel 7.9 Reduces Bundle Sizes, Adds TypeScript 3.8 Support.
More of relevant info about Using Babel with TypeScript in TS docs.
Detailed look into benefits using and how isolatedModules
TS compiler option works type-only imports — A new TypeScript feature that benefits Babel users