Skip to content

Enforce type in front of type-only imports #2618

Open
@pokey

Description

We want to proceed in the following steps, each in its own PR, in the following exact order:

  • enable "@typescript-eslint/consistent-type-imports": "error"
  • enable --verbatimModuleSyntax TS flag
  • enable "import/consistent-type-specifier-style": ["error", "prefer-top-level"]
  • enable "import/no-duplicates": "error" (note we don't need prefer-inline because we don't use inline)

The reasoning is that we want import type to be like its own kind of statement that we know always gets dropped in the output Javascript, and in addition, if we were to have a rule where import {type foo} => import type {foo} only when there are no non-type imports in the statement, it would feel a bit inconsistent that it doesn't happen when there are non-type imports. The proposed rule is simpler: types always get imported in their own statement, and never have side effects

Each step should be its own PR, and they should be in the above order. Note that 1) must come before 2) because without 2), 1) should have no side effects, and then the effects of 2) should become more clear once 1) is in

Note that we don't need no-import-type-side-effects lint rule because 2 and 3 won't allow us to have inline type anywhere

Before merging each PR, we want to test the following cases:

  • you use something as a type but not runtime and it's currently imported as runtime
  • you use something as a type that is not yet imported
  • you use something as runtime that is currently imported as a type

For each of the above cases, we want to test:

  • Auto-fix
  • Organize imports
  • Auto-import

Originally posted by @pokey in #1832 (comment)

Metadata

Assignees

No one assigned

    Labels

    code qualityImprovements to code quality

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions