JS.TS.CONSISTENT.TYPE.EXPORTS

Enforce consistent usage of type exports

TypeScript 3.8 added support for type-only exports.

Type-only exports allow you to specify that 1 or more named exports are exported as type-only. This allows transpilers to drop exports without knowing the types of the dependencies.

Rule Details

This rule aims to standardize the use of type exports style across a codebase.

Given a class Button, and an interface ButtonProps, examples of code:

<!--tabs-->

Incorrect

コピー
interface ButtonProps {
  onClick: () => void;
}
class Button implements ButtonProps {
  onClick() {
    console.log('button!');
  }
}
export { Button, ButtonProps };

Correct

コピー
interface ButtonProps {
  onClick: () => void;
}
class Button implements ButtonProps {
  onClick() {
    console.log('button!');
  }
}
export { Button };
export type { ButtonProps };

Options

コピー
interface Options {
  fixMixedExportsWithInlineTypeSpecifier?: boolean;
}

const defaultOptions: Options = {
  fixMixedExportsWithInlineTypeSpecifier: false,
};

fixMixedExportsWithInlineTypeSpecifier

When this is set to true, the rule will autofix "mixed" export cases using TS 4.5's "inline type specifier". If you are using a TypeScript version less than 4.5, then you will not be able to use this option.

For example the following code:

コピー
const x = 1;
type T = number;

export { x, T };

With {fixMixedExportsWithInlineTypeSpecifier: true} will be fixed to:

コピー
const x = 1;
type T = number;

export { x, type T };

With {fixMixedExportsWithInlineTypeSpecifier: false} will be fixed to:

コピー
const x = 1;
type T = number;

export type { T };
export { x };

<!--tabs-->

Incorrect

コピー
export { Button } from 'some-library';
export type { ButtonProps } from 'some-library';

Correct

コピー
export { Button, type ButtonProps } from 'some-library';

When Not To Use It

  • If you are using a TypeScript version less than 3.8, then you will not be able to use this rule as type exports are not supported.
  • If you specifically want to use both export kinds for stylistic reasons, you can disable this rule.
  • If you use --isolatedModules the compiler would error if a type is not re-exported using export type. If you also don't wish to enforce one style over the other, you can disable this rule.

The content on this page is adapted from the ESLint User Guide. Copyright © OpenJS Foundation and other contributors, www.openjsf.org. All rights reserved. https://eslint.org/docs/rules/