Overview
@typescript-eslint/eslint-plugin includes over 100 rules that detect best practice violations, bugs, and/or stylistic issues specifically for TypeScript code.
See Configs for how to enable recommended rules using configs.
Supported Rules
| Rule | ✅ 🔒 | 🔧 💡 | 💭 | 
|---|---|---|---|
| @typescript-eslint/adjacent-overload-signaturesRequire that function overload signatures be consecutive | ✅ | ||
| @typescript-eslint/array-typeRequire consistently using either T[]orArray<T>for arrays | 🔒 | 🔧 | |
| @typescript-eslint/await-thenableDisallow awaiting a value that is not a Thenable | ✅ | 💭 | |
| @typescript-eslint/ban-ts-commentDisallow @ts-<directive>comments or require descriptions after directives | ✅ | ||
| @typescript-eslint/ban-tslint-commentDisallow // tslint:<rule-flag>comments | 🔒 | 🔧 | |
| @typescript-eslint/ban-typesDisallow certain types | ✅ | 🔧 | |
| @typescript-eslint/class-literal-property-styleEnforce that literals on classes are exposed in a consistent style | 🔒 | 🔧 | |
| @typescript-eslint/consistent-generic-constructorsEnforce specifying generic type arguments on type annotation or constructor name of a constructor call | 🔒 | 🔧 | |
| @typescript-eslint/consistent-indexed-object-styleRequire or disallow the Recordtype | 🔒 | 🔧 | |
| @typescript-eslint/consistent-type-assertionsEnforce consistent usage of type assertions | 🔒 | ||
| @typescript-eslint/consistent-type-definitionsEnforce type definitions to consistently use either interfaceortype | 🔒 | 🔧 | |
| @typescript-eslint/consistent-type-exportsEnforce consistent usage of type exports | 🔧 | 💭 | |
| @typescript-eslint/consistent-type-importsEnforce consistent usage of type imports | 🔧 | ||
| @typescript-eslint/explicit-function-return-typeRequire explicit return types on functions and class methods | |||
| @typescript-eslint/explicit-member-accessibilityRequire explicit accessibility modifiers on class properties and methods | 🔧 💡 | ||
| @typescript-eslint/explicit-module-boundary-typesRequire explicit return and argument types on exported functions' and classes' public class methods | |||
| @typescript-eslint/member-delimiter-styleRequire a specific member delimiter style for interfaces and type literals | 🔧 | ||
| @typescript-eslint/member-orderingRequire a consistent member declaration order | |||
| @typescript-eslint/method-signature-styleEnforce using a particular method signature syntax | 🔧 | ||
| @typescript-eslint/naming-conventionEnforce naming conventions for everything across a codebase | 💭 | ||
| @typescript-eslint/no-base-to-stringRequire .toString()to only be called on objects which provide useful information when stringified | 🔒 | 💭 | |
| @typescript-eslint/no-confusing-non-null-assertionDisallow non-null assertion in locations that may be confusing | 🔒 | 🔧 💡 | |
| @typescript-eslint/no-confusing-void-expressionRequire expressions of type void to appear in statement position | 🔧 💡 | 💭 | |
| @typescript-eslint/no-duplicate-enum-valuesDisallow duplicate enum member values | 🔒 | ||
| @typescript-eslint/no-dynamic-deleteDisallow using the deleteoperator on computed key expressions | 🔒 | 🔧 | |
| @typescript-eslint/no-empty-interfaceDisallow the declaration of empty interfaces | ✅ | 🔧 💡 | |
| @typescript-eslint/no-explicit-anyDisallow the anytype | ✅ | 🔧 💡 | |
| @typescript-eslint/no-extra-non-null-assertionDisallow extra non-null assertions | ✅ | 🔧 | |
| @typescript-eslint/no-extraneous-classDisallow classes used as namespaces | 🔒 | ||
| @typescript-eslint/no-floating-promisesRequire Promise-like statements to be handled appropriately | ✅ | 💡 | 💭 | 
| @typescript-eslint/no-for-in-arrayDisallow iterating over an array with a for-in loop | ✅ | 💭 | |
| @typescript-eslint/no-implicit-any-catchDisallow usage of the implicit anytype in catch clauses | 🔧 💡 | ||
| @typescript-eslint/no-inferrable-typesDisallow explicit type declarations for variables or parameters initialized to a number, string, or boolean | ✅ | 🔧 | |
| @typescript-eslint/no-invalid-void-typeDisallow voidtype outside of generic or return types | 🔒 | ||
| @typescript-eslint/no-meaningless-void-operatorDisallow the voidoperator except when used to discard a value | 🔒 | 🔧 💡 | 💭 | 
| @typescript-eslint/no-misused-newEnforce valid definition of newandconstructor | ✅ | ||
| @typescript-eslint/no-misused-promisesDisallow Promises in places not designed to handle them | ✅ | 💭 | |
| @typescript-eslint/no-namespaceDisallow TypeScript namespaces | ✅ | ||
| @typescript-eslint/no-non-null-asserted-nullish-coalescingDisallow non-null assertions in the left operand of a nullish coalescing operator | 🔒 | 💡 | |
| @typescript-eslint/no-non-null-asserted-optional-chainDisallow non-null assertions after an optional chain expression | ✅ | 💡 | |
| @typescript-eslint/no-non-null-assertionDisallow non-null assertions using the !postfix operator | ✅ | 💡 | |
| @typescript-eslint/no-parameter-propertiesDisallow the use of parameter properties in class constructors | |||
| @typescript-eslint/no-redundant-type-constituentsDisallow members of unions and intersections that do nothing or override type information | 💭 | ||
| @typescript-eslint/no-require-importsDisallow invocation of require() | |||
| @typescript-eslint/no-this-aliasDisallow aliasing this | ✅ | ||
| @typescript-eslint/no-type-aliasDisallow type aliases | |||
| @typescript-eslint/no-unnecessary-boolean-literal-compareDisallow unnecessary equality comparisons against boolean literals | 🔒 | 🔧 | 💭 | 
| @typescript-eslint/no-unnecessary-conditionDisallow conditionals where the type is always truthy or always falsy | 🔒 | 🔧 | 💭 | 
| @typescript-eslint/no-unnecessary-qualifierDisallow unnecessary namespace qualifiers | 🔧 | 💭 | |
| @typescript-eslint/no-unnecessary-type-argumentsDisallow type arguments that are equal to the default | 🔒 | 🔧 | 💭 | 
| @typescript-eslint/no-unnecessary-type-assertionDisallow type assertions that do not change the type of an expression | ✅ | 🔧 | 💭 | 
| @typescript-eslint/no-unnecessary-type-constraintDisallow unnecessary constraints on generic types | ✅ | 💡 | |
| @typescript-eslint/no-unsafe-argumentDisallow calling a function with a value with type any | ✅ | 💭 | |
| @typescript-eslint/no-unsafe-assignmentDisallow assigning a value with type anyto variables and properties | ✅ | 💭 | |
| @typescript-eslint/no-unsafe-callDisallow calling a value with type any | ✅ | 💭 | |
| @typescript-eslint/no-unsafe-declaration-mergingDisallow unsafe declaration merging | 🔒 | ||
| @typescript-eslint/no-unsafe-member-accessDisallow member access on a value with type any | ✅ | 💭 | |
| @typescript-eslint/no-unsafe-returnDisallow returning a value with type anyfrom a function | ✅ | 💭 | |
| @typescript-eslint/no-useless-empty-exportDisallow empty exports that don't change anything in a module file | 🔧 | ||
| @typescript-eslint/no-var-requiresDisallow requirestatements except in import statements | ✅ | ||
| @typescript-eslint/non-nullable-type-assertion-styleEnforce non-null assertions over explicit type casts | 🔒 | 🔧 | 💭 | 
| @typescript-eslint/parameter-propertiesRequire or disallow parameter properties in class constructors | |||
| @typescript-eslint/prefer-as-constEnforce the use of as constover literal type | ✅ | 🔧 💡 | |
| @typescript-eslint/prefer-enum-initializersRequire each enum member value to be explicitly initialized | 💡 | ||
| @typescript-eslint/prefer-for-ofEnforce the use of for-ofloop over the standardforloop where possible | 🔒 | ||
| @typescript-eslint/prefer-function-typeEnforce using function types instead of interfaces with call signatures | 🔒 | 🔧 | |
| @typescript-eslint/prefer-includesEnforce includesmethod overindexOfmethod | 🔒 | 🔧 | 💭 | 
| @typescript-eslint/prefer-literal-enum-memberRequire all enum members to be literal values | 🔒 | ||
| @typescript-eslint/prefer-namespace-keywordRequire using namespacekeyword overmodulekeyword to declare custom TypeScript modules | ✅ | 🔧 | |
| @typescript-eslint/prefer-nullish-coalescingEnforce using the nullish coalescing operator instead of logical chaining | 🔒 | 💡 | 💭 | 
| @typescript-eslint/prefer-optional-chainEnforce using concise optional chain expressions instead of chained logical ands, negated logical ors, or empty objects | 🔒 | 💡 | |
| @typescript-eslint/prefer-readonlyRequire private members to be marked as readonlyif they're never modified outside of the constructor | 🔧 | 💭 | |
| @typescript-eslint/prefer-readonly-parameter-typesRequire function parameters to be typed as readonlyto prevent accidental mutation of inputs | 💭 | ||
| @typescript-eslint/prefer-reduce-type-parameterEnforce using type parameter when calling Array#reduceinstead of casting | 🔒 | 🔧 | 💭 | 
| @typescript-eslint/prefer-regexp-execEnforce RegExp#execoverString#matchif no global flag is provided | 🔧 | 💭 | |
| @typescript-eslint/prefer-return-this-typeEnforce that thisis used when onlythistype is returned | 🔒 | 🔧 | 💭 | 
| @typescript-eslint/prefer-string-starts-ends-withEnforce using String#startsWithandString#endsWithover other equivalent methods of checking substrings | 🔒 | 🔧 | 💭 | 
| @typescript-eslint/prefer-ts-expect-errorEnforce using @ts-expect-errorover@ts-ignore | 🔒 | 🔧 | |
| @typescript-eslint/promise-function-asyncRequire any function or method that returns a Promise to be marked async | 🔧 | 💭 | |
| @typescript-eslint/require-array-sort-compareRequire Array#sortcalls to always provide acompareFunction | 💭 | ||
| @typescript-eslint/restrict-plus-operandsRequire both operands of addition to be the same type and be bigint,number, orstring | ✅ | 💭 | |
| @typescript-eslint/restrict-template-expressionsEnforce template literal expressions to be of stringtype | ✅ | 💭 | |
| @typescript-eslint/sort-type-constituentsEnforce constituents of a type union/intersection to be sorted alphabetically | 🔧 💡 | ||
| @typescript-eslint/sort-type-union-intersection-membersEnforce members of a type union/intersection to be sorted alphabetically | 🔧 💡 | ||
| @typescript-eslint/strict-boolean-expressionsDisallow certain types in boolean expressions | 🔧 💡 | 💭 | |
| @typescript-eslint/switch-exhaustiveness-checkRequire switch-case statements to be exhaustive with union type | 💡 | 💭 | |
| @typescript-eslint/triple-slash-referenceDisallow certain triple slash directives in favor of ES6-style import declarations | ✅ | ||
| @typescript-eslint/type-annotation-spacingRequire consistent spacing around type annotations | 🔧 | ||
| @typescript-eslint/typedefRequire type annotations in certain places | |||
| @typescript-eslint/unbound-methodEnforce unbound methods are called with their expected scope | ✅ | 💭 | |
| @typescript-eslint/unified-signaturesDisallow 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.
| Rule | ✅ 🔒 | 🔧 💡 | 💭 | 
|---|---|---|---|
| @typescript-eslint/brace-styleEnforce consistent brace style for blocks | 🔧 | ||
| @typescript-eslint/comma-dangleRequire or disallow trailing commas | 🔧 | ||
| @typescript-eslint/comma-spacingEnforce consistent spacing before and after commas | 🔧 | ||
| @typescript-eslint/default-param-lastEnforce default parameters to be last | |||
| @typescript-eslint/dot-notationEnforce dot notation whenever possible | 🔒 | 🔧 | 💭 | 
| @typescript-eslint/func-call-spacingRequire or disallow spacing between function identifiers and their invocations | 🔧 | ||
| @typescript-eslint/indentEnforce consistent indentation | 🔧 | ||
| @typescript-eslint/init-declarationsRequire or disallow initialization in variable declarations | |||
| @typescript-eslint/key-spacingEnforce consistent spacing between property names and type annotations in types and interfaces | 🔧 | ||
| @typescript-eslint/keyword-spacingEnforce consistent spacing before and after keywords | 🔧 | ||
| @typescript-eslint/lines-between-class-membersRequire or disallow an empty line between class members | 🔧 | ||
| @typescript-eslint/no-array-constructorDisallow generic Arrayconstructors | ✅ | 🔧 | |
| @typescript-eslint/no-dupe-class-membersDisallow duplicate class members | |||
| @typescript-eslint/no-duplicate-importsDisallow duplicate imports | |||
| @typescript-eslint/no-empty-functionDisallow empty functions | ✅ | ||
| @typescript-eslint/no-extra-parensDisallow unnecessary parentheses | 🔧 | ||
| @typescript-eslint/no-extra-semiDisallow unnecessary semicolons | ✅ | 🔧 | |
| @typescript-eslint/no-implied-evalDisallow the use of eval()-like methods | ✅ | 💭 | |
| @typescript-eslint/no-invalid-thisDisallow thiskeywords outside of classes or class-like objects | |||
| @typescript-eslint/no-loop-funcDisallow function declarations that contain unsafe references inside loop statements | |||
| @typescript-eslint/no-loss-of-precisionDisallow literal numbers that lose precision | ✅ | ||
| @typescript-eslint/no-magic-numbersDisallow magic numbers | |||
| @typescript-eslint/no-redeclareDisallow variable redeclaration | |||
| @typescript-eslint/no-restricted-importsDisallow specified modules when loaded by import | |||
| @typescript-eslint/no-shadowDisallow variable declarations from shadowing variables declared in the outer scope | |||
| @typescript-eslint/no-throw-literalDisallow throwing literals as exceptions | 🔒 | 💭 | |
| @typescript-eslint/no-unused-expressionsDisallow unused expressions | |||
| @typescript-eslint/no-unused-varsDisallow unused variables | ✅ | ||
| @typescript-eslint/no-use-before-defineDisallow the use of variables before they are defined | |||
| @typescript-eslint/no-useless-constructorDisallow unnecessary constructors | 🔒 | ||
| @typescript-eslint/object-curly-spacingEnforce consistent spacing inside braces | 🔧 | ||
| @typescript-eslint/padding-line-between-statementsRequire or disallow padding lines between statements | 🔧 | ||
| @typescript-eslint/quotesEnforce the consistent use of either backticks, double, or single quotes | 🔧 | ||
| @typescript-eslint/require-awaitDisallow async functions which have no awaitexpression | ✅ | 💭 | |
| @typescript-eslint/return-awaitEnforce consistent returning of awaited values | 🔧 💡 | 💭 | |
| @typescript-eslint/semiRequire or disallow semicolons instead of ASI | 🔧 | ||
| @typescript-eslint/space-before-blocksEnforce consistent spacing before blocks | 🔧 | ||
| @typescript-eslint/space-before-function-parenEnforce consistent spacing before function parenthesis | 🔧 | ||
| @typescript-eslint/space-infix-opsRequire spacing around infix operators | 🔧 |