Skip to content

Latest commit

 

History

History
241 lines (202 loc) · 39.4 KB

File metadata and controls

241 lines (202 loc) · 39.4 KB

ESLint Plugin TypeScript

An ESLint plugin which provides lint rules for TypeScript codebases.

CI NPM Version NPM Downloads

Getting Started

These docs walk you through setting up ESLint, this plugin, and our parser. If you know what you're doing and just want to quick start, read on...

Quick-start

Installation

Make sure you have TypeScript and @typescript-eslint/parser installed:

$ yarn add -D typescript @typescript-eslint/parser
$ npm i --save-dev typescript @typescript-eslint/parser

Then install the plugin:

$ yarn add -D @typescript-eslint/eslint-plugin
$ npm i --save-dev @typescript-eslint/eslint-plugin

It is important that you use the same version number for @typescript-eslint/parser and @typescript-eslint/eslint-plugin.

Note: If you installed ESLint globally (using the -g flag) then you must also install @typescript-eslint/eslint-plugin globally.

Usage

Add @typescript-eslint/parser to the parser field and @typescript-eslint to the plugins section of your .eslintrc configuration file, then configure the rules you want to use under the rules section.

{
  "parser": "@typescript-eslint/parser",
  "plugins": ["@typescript-eslint"],
  "rules": {
    "@typescript-eslint/rule-name": "error"
  }
}

You can also enable all the recommended rules for our plugin. Add plugin:@typescript-eslint/recommended in extends:

{
  "extends": ["plugin:@typescript-eslint/recommended"]
}

Recommended Configs

You can also use eslint:recommended (the set of rules which are recommended for all projects by the ESLint Team) with this plugin:

{
  "extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended"]
}

As of version 2 of this plugin, by design, none of the rules in the main recommended config require type-checking in order to run. This means that they are more lightweight and faster to run.

Some highly valuable rules require type-checking in order to be implemented correctly, however, so we provide an additional config you can extend from called recommended-requiring-type-checking. You would apply this in addition to the recommended configs previously mentioned, e.g.:

{
  "extends": [
    "eslint:recommended",
    "plugin:@typescript-eslint/recommended",
    "plugin:@typescript-eslint/recommended-requiring-type-checking"
  ]
}

Pro Tip: For larger codebases you may want to consider splitting our linting into two separate stages: 1. fast feedback rules which operate purely based on syntax (no type-checking), 2. rules which are based on semantics (type-checking).

You can read more about linting with type information here

Supported Rules

Key: ✅ = recommended, 🔒 = strict, 🔧 = fixable, 💭 = requires type information

Name Description ✅🔒 🔧 💭
@typescript-eslint/adjacent-overload-signatures Require that member overloads be consecutive
@typescript-eslint/array-type Require using either T[] or Array<T> for arrays 🔒 🔧
@typescript-eslint/await-thenable Disallow awaiting a value that is not a Thenable 💭
@typescript-eslint/ban-ts-comment Disallow @ts-<directive> comments or require descriptions after directive
@typescript-eslint/ban-tslint-comment Disallow // tslint:<rule-flag> comments 🔒 🔧
@typescript-eslint/ban-types Disallow certain types 🔧
@typescript-eslint/class-literal-property-style Enforce that literals on classes are exposed in a consistent style 🔒 🔧
@typescript-eslint/consistent-generic-constructors Enforce specifying generic type arguments on type annotation or constructor name of a constructor call 🔒 🔧
@typescript-eslint/consistent-indexed-object-style Require or disallow the Record type 🔒 🔧
@typescript-eslint/consistent-type-assertions Enforce consistent usage of type assertions 🔒
@typescript-eslint/consistent-type-definitions Enforce type definitions to consistently use either interface or type 🔒 🔧
@typescript-eslint/consistent-type-exports Enforce consistent usage of type exports 🔧 💭
@typescript-eslint/consistent-type-imports Enforce consistent usage of type imports 🔧
@typescript-eslint/explicit-function-return-type Require explicit return types on functions and class methods
@typescript-eslint/explicit-member-accessibility Require explicit accessibility modifiers on class properties and methods 🔧
@typescript-eslint/explicit-module-boundary-types Require explicit return and argument types on exported functions' and classes' public class methods
@typescript-eslint/member-delimiter-style Require a specific member delimiter style for interfaces and type literals 🔧
@typescript-eslint/member-ordering Require a consistent member declaration order
@typescript-eslint/method-signature-style Enforce using a particular method signature syntax 🔧
@typescript-eslint/naming-convention Enforce naming conventions for everything across a codebase 💭
@typescript-eslint/no-base-to-string Require .toString() to only be called on objects which provide useful information when stringified 🔒 💭
@typescript-eslint/no-confusing-non-null-assertion Disallow non-null assertion in locations that may be confusing 🔒 🔧
@typescript-eslint/no-confusing-void-expression Require expressions of type void to appear in statement position 🔧 💭
@typescript-eslint/no-duplicate-enum-values Disallow duplicate enum member values 🔒
@typescript-eslint/no-dynamic-delete Disallow using the delete operator on computed key expressions 🔒 🔧
@typescript-eslint/no-empty-interface Disallow the declaration of empty interfaces 🔧
@typescript-eslint/no-explicit-any Disallow the any type 🔧
@typescript-eslint/no-extra-non-null-assertion Disallow extra non-null assertion 🔧
@typescript-eslint/no-extraneous-class Disallow classes used as namespaces 🔒
@typescript-eslint/no-floating-promises Require Promise-like statements to be handled appropriately 💭
@typescript-eslint/no-for-in-array Disallow iterating over an array with a for-in loop 💭
@typescript-eslint/no-inferrable-types Disallow explicit type declarations for variables or parameters initialized to a number, string, or boolean 🔧
@typescript-eslint/no-invalid-void-type Disallow void type outside of generic or return types 🔒
@typescript-eslint/no-meaningless-void-operator Disallow the void operator except when used to discard a value 🔒 🔧 💭
@typescript-eslint/no-misused-new Enforce valid definition of new and constructor
@typescript-eslint/no-misused-promises Disallow Promises in places not designed to handle them 💭
@typescript-eslint/no-namespace Disallow custom TypeScript modules and namespaces
@typescript-eslint/no-non-null-asserted-nullish-coalescing Disallow non-null assertions in the left operand of a nullish coalescing operator 🔒
@typescript-eslint/no-non-null-asserted-optional-chain Disallow non-null assertions after an optional chain expression
@typescript-eslint/no-non-null-assertion Disallow non-null assertions using the ! postfix operator
@typescript-eslint/no-redundant-type-constituents Disallow members of unions and intersections that do nothing or override type information 💭
@typescript-eslint/no-require-imports Disallow invocation of require()
@typescript-eslint/no-this-alias Disallow aliasing this
@typescript-eslint/no-type-alias Disallow type aliases
@typescript-eslint/no-unnecessary-boolean-literal-compare Disallow unnecessary equality comparisons against boolean literals 🔒 🔧 💭
@typescript-eslint/no-unnecessary-condition Disallow conditionals where the type is always truthy or always falsy 🔒 🔧 💭
@typescript-eslint/no-unnecessary-qualifier Disallow unnecessary namespace qualifiers 🔧 💭
@typescript-eslint/no-unnecessary-type-arguments Disallow type arguments that are equal to the default 🔒 🔧 💭
@typescript-eslint/no-unnecessary-type-assertion Disallow type assertions that do not change the type of an expression 🔧 💭
@typescript-eslint/no-unnecessary-type-constraint Disallow unnecessary constraints on generic types
@typescript-eslint/no-unsafe-argument Disallow calling a function with a value with type any 💭
@typescript-eslint/no-unsafe-assignment Disallow assigning a value with type any to variables and properties 💭
@typescript-eslint/no-unsafe-call Disallow calling a value with type any 💭
@typescript-eslint/no-unsafe-member-access Disallow member access on a value with type any 💭
@typescript-eslint/no-unsafe-return Disallow returning a value with type any from a function 💭
@typescript-eslint/no-useless-empty-export Disallow empty exports that don't change anything in a module file 🔧
@typescript-eslint/no-var-requires Disallow require statements except in import statements
@typescript-eslint/non-nullable-type-assertion-style Enforce non-null assertions over explicit type casts 🔒 🔧 💭
@typescript-eslint/parameter-properties Require or disallow parameter properties in class constructors
@typescript-eslint/prefer-as-const Enforce the use of as const over literal type 🔧
@typescript-eslint/prefer-enum-initializers Require each enum member value to be explicitly initialized
@typescript-eslint/prefer-for-of Enforce the use of for-of loop over the standard for loop where possible 🔒
@typescript-eslint/prefer-function-type Enforce using function types instead of interfaces with call signatures 🔒 🔧
@typescript-eslint/prefer-includes Enforce includes method over indexOf method 🔒 🔧 💭
@typescript-eslint/prefer-literal-enum-member Require all enum members to be literal values 🔒
@typescript-eslint/prefer-namespace-keyword Require using namespace keyword over module keyword to declare custom TypeScript modules 🔧
@typescript-eslint/prefer-nullish-coalescing Enforce using the nullish coalescing operator instead of logical chaining 🔒 💭
@typescript-eslint/prefer-optional-chain Enforce using concise optional chain expressions instead of chained logical ands 🔒
@typescript-eslint/prefer-readonly Require private members to be marked as readonly if they're never modified outside of the constructor 🔧 💭
@typescript-eslint/prefer-readonly-parameter-types Require function parameters to be typed as readonly to prevent accidental mutation of inputs 💭
@typescript-eslint/prefer-reduce-type-parameter Enforce using type parameter when calling Array#reduce instead of casting 🔒 🔧 💭
@typescript-eslint/prefer-regexp-exec Enforce RegExp#exec over String#match if no global flag is provided 🔧 💭
@typescript-eslint/prefer-return-this-type Enforce that this is used when only this type is returned 🔒 🔧 💭
@typescript-eslint/prefer-string-starts-ends-with Enforce using String#startsWith and String#endsWith over other equivalent methods of checking substrings 🔒 🔧 💭
@typescript-eslint/prefer-ts-expect-error Enforce using @ts-expect-error over @ts-ignore 🔒 🔧
@typescript-eslint/promise-function-async Require any function or method that returns a Promise to be marked async 🔧 💭
@typescript-eslint/require-array-sort-compare Require Array#sort calls to always provide a compareFunction 💭
@typescript-eslint/restrict-plus-operands Require both operands of addition to have type number or string 💭
@typescript-eslint/restrict-template-expressions Enforce template literal expressions to be of string type 💭
@typescript-eslint/sort-type-union-intersection-members Enforce members of a type union/intersection to be sorted alphabetically 🔧
@typescript-eslint/strict-boolean-expressions Disallow certain types in boolean expressions 🔧 💭
@typescript-eslint/switch-exhaustiveness-check Require switch-case statements to be exhaustive with union type 💭
@typescript-eslint/triple-slash-reference Disallow certain triple slash directives in favor of ES6-style import declarations
@typescript-eslint/type-annotation-spacing Require consistent spacing around type annotations 🔧
@typescript-eslint/typedef Require type annotations in certain places
@typescript-eslint/unbound-method Enforce unbound methods are called with their expected scope 💭
@typescript-eslint/unified-signatures Disallow two overloads that could be unified into one with a union or an optional/rest parameter 🔒

Extension Rules

In some cases, ESLint provides a rule itself, but it doesn't support TypeScript syntax; either it crashes, or it ignores the syntax, or it falsely reports against it. In these cases, we create what we call an extension rule; a rule within our plugin that has the same functionality, but also supports TypeScript.

Key: ✅ = recommended, 🔒 = strict, 🔧 = fixable, 💭 = requires type information

Name Description ✅🔒 🔧 💭
@typescript-eslint/brace-style Enforce consistent brace style for blocks 🔧
@typescript-eslint/comma-dangle Require or disallow trailing commas 🔧
@typescript-eslint/comma-spacing Enforce consistent spacing before and after commas 🔧
@typescript-eslint/default-param-last Enforce default parameters to be last
@typescript-eslint/dot-notation Enforce dot notation whenever possible 🔒 🔧 💭
@typescript-eslint/func-call-spacing Require or disallow spacing between function identifiers and their invocations 🔧
@typescript-eslint/indent Enforce consistent indentation 🔧
@typescript-eslint/init-declarations Require or disallow initialization in variable declarations
@typescript-eslint/keyword-spacing Enforce consistent spacing before and after keywords 🔧
@typescript-eslint/lines-between-class-members Require or disallow an empty line between class members 🔧
@typescript-eslint/no-array-constructor Disallow generic Array constructors 🔧
@typescript-eslint/no-dupe-class-members Disallow duplicate class members
@typescript-eslint/no-empty-function Disallow empty functions
@typescript-eslint/no-extra-parens Disallow unnecessary parentheses 🔧
@typescript-eslint/no-extra-semi Disallow unnecessary semicolons 🔧
@typescript-eslint/no-implied-eval Disallow the use of eval()-like methods 💭
@typescript-eslint/no-invalid-this Disallow this keywords outside of classes or class-like objects
@typescript-eslint/no-loop-func Disallow function declarations that contain unsafe references inside loop statements
@typescript-eslint/no-loss-of-precision Disallow literal numbers that lose precision
@typescript-eslint/no-magic-numbers Disallow magic numbers
@typescript-eslint/no-redeclare Disallow variable redeclaration
@typescript-eslint/no-restricted-imports Disallow specified modules when loaded by import
@typescript-eslint/no-shadow Disallow variable declarations from shadowing variables declared in the outer scope
@typescript-eslint/no-throw-literal Disallow throwing literals as exceptions 🔒 💭
@typescript-eslint/no-unused-expressions Disallow unused expressions
@typescript-eslint/no-unused-vars Disallow unused variables
@typescript-eslint/no-use-before-define Disallow the use of variables before they are defined
@typescript-eslint/no-useless-constructor Disallow unnecessary constructors 🔒
@typescript-eslint/object-curly-spacing Enforce consistent spacing inside braces 🔧
@typescript-eslint/padding-line-between-statements Require or disallow padding lines between statements 🔧
@typescript-eslint/quotes Enforce the consistent use of either backticks, double, or single quotes 🔧
@typescript-eslint/require-await Disallow async functions which have no await expression 💭
@typescript-eslint/return-await Enforce consistent returning of awaited values 🔧 💭
@typescript-eslint/semi Require or disallow semicolons instead of ASI 🔧
@typescript-eslint/space-before-blocks Enforce consistent spacing before blocks 🔧
@typescript-eslint/space-before-function-paren Enforce consistent spacing before function parenthesis 🔧
@typescript-eslint/space-infix-ops Require spacing around infix operators 🔧

Contributing

See the contributing guide here.