typescript-eslint - Quick Reference
When to Use This Skill
- Configure ESLint for TypeScript projects
- Type-aware rules for TypeScript
- Migration from TSLint
When NOT to Use This Skill
- Full ESLint 9 setup - Use
eslint-biome skill for complete configuration
- Biome linter - Use
eslint-biome skill for Biome setup
- Code quality principles - Use
quality-common for SOLID/Clean Code
- Java/Kotlin - Use
sonarqube skill for JVM languages
Deep Knowledge: Use mcp__documentation__fetch_docs with technology: typescript-eslint for comprehensive documentation.
Basic Setup
npm install -D eslint typescript-eslint
Flat Config (ESLint 9+)
eslint.config.mjs
import eslint from '@eslint/js';
import tseslint from 'typescript-eslint';
export default tseslint.config(
eslint.configs.recommended,
...tseslint.configs.recommended,
);
Type-Aware Linting
import eslint from '@eslint/js';
import tseslint from 'typescript-eslint';
export default tseslint.config(
eslint.configs.recommended,
...tseslint.configs.recommendedTypeChecked,
{
languageOptions: {
parserOptions: {
projectService: true,
tsconfigRootDir: import.meta.dirname,
},
},
},
);
Strict Configuration
export default tseslint.config(
eslint.configs.recommended,
...tseslint.configs.strictTypeChecked,
...tseslint.configs.stylisticTypeChecked,
);
Common Rules
{
rules: {
// Prevent unused variables
'@typescript-eslint/no-unused-vars': ['error', {
argsIgnorePattern: '^_'
}],
// Require explicit return types
'@typescript-eslint/explicit-function-return-type': 'warn',
// Prevent any usage
'@typescript-eslint/no-explicit-any': 'error',
// Require await in async functions
'@typescript-eslint/require-await': 'error',
// Prevent floating promises
'@typescript-eslint/no-floating-promises': 'error',
// Consistent type imports
'@typescript-eslint/consistent-type-imports': 'error',
}
}
File-Specific Rules
export default tseslint.config(
// ... base config
{
files: ['**/*.test.ts', '**/*.spec.ts'],
rules: {
'@typescript-eslint/no-explicit-any': 'off',
},
},
{
files: ['**/*.js'],
...tseslint.configs.disableTypeChecked,
},
);
Anti-Patterns
| Anti-Pattern |
Why It's Bad |
Correct Approach |
| Not using type-aware rules |
Misses Promise, async issues |
Use recommendedTypeChecked |
Allowing any everywhere |
Defeats TypeScript purpose |
Set no-explicit-any: error |
No require-await rule |
Unnecessary async keywords |
Enable type-aware async rules |
| Type checking JS files |
JS has no types |
Use disableTypeChecked for .js |
| Disabling rules in test files |
Tests need quality too |
Only disable no-explicit-any if needed |
| Ignoring unused variables |
Code smell, unused imports |
Use no-unused-vars with ignore pattern |
Quick Troubleshooting
| Issue |
Likely Cause |
Solution |
| Type-aware rules not working |
Missing projectService: true |
Add to languageOptions.parserOptions |
| Linting very slow |
Type checking all files |
Limit type rules to **/*.ts only |
| "Unsafe" errors everywhere |
Strict type checking |
Use strictTypeChecked or disable specific rules |
| Promise errors not caught |
Missing no-floating-promises |
Enable in recommendedTypeChecked preset |
| Unused imports not detected |
Wrong rule configuration |
Use @typescript-eslint/no-unused-vars |
| Rules conflict with Prettier |
Both formatting code |
Add eslint-config-prettier last |