Should I use import type for local imports in TypeScript?

Do I need to use the typescript import type feature if all of my imports are from my own file?

I have a simple file types.ts that defines some types:

export interface MyInterface {
   // ...
}

export const enum MyEnum {
   // ...
}

export type MyType = {
  // ...
}

I have read about the new typescript import type feature in the latest TypeScript release. As I understand, it is mainly intended to fix specific issues when importing from .js files.

I can import my types with both import and import type statements, and both seem to work fine. The question is: should I prefer import type because it is more explicit and helps avoid some theoretical edge-case problems, or can I just use import for simplicity and rely on import elision to remove the unused types from the compiled code?

In other words, are there any benefits to using import type here, or should it be used specifically to address issues with import elision or other edge cases?

Hello @anjuyadav.1398 ,

When working with TypeScript, it’s a good practice to use import type when importing only types. This ensures clarity by explicitly stating that the import is intended solely for type definitions, which prevents unnecessary code from being included in the output. For example:

import type { MyInterface } from './types';

By doing this, TypeScript knows to only use the import for type-checking, helping to avoid potential circular dependencies and reducing the final build size. This approach is especially beneficial in large projects where unused code elimination can improve performance.

Best regards,
Macy

Use import if you prefer simplicity and have no circular dependency concerns: If you find import type too verbose for your codebase and your project doesn’t have circular dependency problems, you can continue using the regular import statement. TypeScript will still handle the elision of unused types at compile time:

import { MyInterface } from ‘./types’;

In simple cases, this may be just as effective without introducing extra complexity.

Leverage import type for better tree-shaking support: If you’re using modern build tools like Webpack or Rollup that support tree shaking, using import type can help ensure that only the type information is included, and not the implementation details. This reduces the amount of code that ends up in the final bundle, which can lead to smaller bundle sizes:

import type { MyType } from ‘./types’;

This explicit import helps your build tool recognize that the import is purely for type-checking and should not be bundled into the final JavaScript output.