DEV Community

Cover image for Boost Your TypeScript Project with ESLint, Prettier and lint-staged! 🔥🔥🔥
Tal Ohana
Tal Ohana

Posted on • Updated on • Originally published at talohana.com

Boost Your TypeScript Project with ESLint, Prettier and lint-staged! 🔥🔥🔥

The source code of this article can be found in this github repository

Jump To

Introduction 🔮

There are many tools today that makes you really productive, they take away fixing small errors and formatting your code.

In this tutorial we are going to build a TypeScript project from scratch, add it linting and formatting capabilities and at the end making it automatic with every git commit you run.

Creating a TypeScript Project 🚀

We are going to create the simplest TypeScript project. In Order to do so, run the following commands

mkdir typescript-example
cd $_
npm init -y
npm i -D typescript
npx tsc --init
Enter fullscreen mode Exit fullscreen mode

Adding ESLint 📖

First, let's understand what ESLint is all about, from eslint getting-started

ESLint is a tool for identifying and reporting on patterns found in ECMAScript/JavaScript code, with the goal of making code more consistent and avoiding bugs.

Pretty straight forward, it's something you really want in your project.
To add ESLint we'll need to add the following packages

npm i -D eslint @typescript-eslint/parser @typescript-eslint/eslint-plugin
Enter fullscreen mode Exit fullscreen mode

and add two files to our project folder:
A file named .eslintrc.js which contains all our ESLint configurations

// .eslintrc.js
module.exports = {
  root: true,
  parser: "@typescript-eslint/parser",
  plugins: ["@typescript-eslint"],
  extends: [
    "eslint:recommended",
    "plugin:@typescript-eslint/eslint-recommended",
    "plugin:@typescript-eslint/recommended"
  ]
};
Enter fullscreen mode Exit fullscreen mode

You can explore the recommended rules for eslint:recommended here and for @typescript-eslint/recommended here.

A File named .eslintignore so we won't compile node_modules

// .eslintignore
node_modules
Enter fullscreen mode Exit fullscreen mode

PS, add your compiled code folder here or any other folder you wish to ignore

Final thing, let's add two npm scripts that lint and fix the code for us

"scripts": {
  "lint": "eslint . --ext .js,.jsx,.ts,.tsx",
  "lint:fix": "npm run lint -- --fix"
}
Enter fullscreen mode Exit fullscreen mode

In order to test the scripts, add a dummy index.ts file with the following content

const x: number = 123;

console.log(x);
Enter fullscreen mode Exit fullscreen mode

We can see that the type annotation (number) is redundant and can be omitted, after running npm run tslint:fix the file is linted and fixed for us

const x = 123;

console.log(x);
Enter fullscreen mode Exit fullscreen mode

Adding Prettier 💎

So what is Prettier? from Prettier Docs

Prettier is an opinionated code formatter
It removes all original styling* and ensures that all outputted code conforms to a consistent style.

Long story short, you won't have to argue about tabs vs spaces (or any other code-style) ever again!

To add Prettier and integrate it with ESLint add the following packages:

npm i -D prettier eslint-config-prettier eslint-plugin-prettier
Enter fullscreen mode Exit fullscreen mode

Next, we'll update .eslintrc.js to ignore all formatting rules that are not from Prettier, and then use Prettier as an ESLint rule

// .eslintrc.js
module.exports = {
  root: true,
  parser: "@typescript-eslint/parser",
  plugins: [
    "@typescript-eslint",
    "prettier"
  ],
  rules: {
    "prettier/prettier": "error"
  },
  extends: [
    "eslint:recommended",
    "plugin:prettier/recommended",
    "plugin:@typescript-eslint/eslint-recommended",
    "plugin:@typescript-eslint/recommended"
  ]
};
Enter fullscreen mode Exit fullscreen mode

In order to test this, let's create a simple .prettierrc file that contains our Prettier options

// .prettierrc
{
  "singleQuote": true
}

Enter fullscreen mode Exit fullscreen mode

Back to our index.ts let's add some unformatted code

const x: string = "Unformatted String"

console.log(x);
Enter fullscreen mode Exit fullscreen mode

after running npm run tslint:fix we can see the fixed and formatted file

const x = 'Unformatted String';

console.log(x);
Enter fullscreen mode Exit fullscreen mode

Adding lint-staged and husky 🐶

It's pretty easy to forget linting and formatting our code before comitting and pushing it, lint-staged and husky to the rescue!

Husky is a package that helps us integrate with git hooks and lint-staged is helping us to lint our staged files.

First, let's initialize git by running git init and creating .gitingore file

// .gitignore
node_modules
Enter fullscreen mode Exit fullscreen mode

Let's add them by running

npm i -D husky lint-staged
Enter fullscreen mode Exit fullscreen mode

and add their configuration to our package.json

{
  "husky": {
    "hooks": {
      "pre-commit": "lint-staged"
    }
  },
  "lint-staged": {
    "*.{js,jsx,ts,tsx}": "eslint --cache --fix"
  }
}
Enter fullscreen mode Exit fullscreen mode

That's all! now when we git commit our files we'll get linting and formatting automatically.

Top comments (2)

Collapse
 
emalorenzo profile image
Emanuel Lorenzo

That lint-staged config saved me, thanks!

Collapse
 
jamescalviniv profile image
jamescalviniv

Thanks for sharing!