How to Setup Eslint and Prettier With Git Precommit Hooks in React Typescript Project

You should probably create a new react app with typescript using like so:

1npx create-react-app my-app --template typescript

Now let's get started to setup eslint and prettier.
Remove eslintConfig from package.json.
Install prettier using these commands:

1yarn add --dev --exact prettier
2# these are for making eslint and prettier to play well together
3yarn add --dev eslint-config-prettier eslint-plugin-prettier 

Create config files like this:

1touch .eslintrc.js .eslintignore .prettierrc.js .prettierignore

Use same contents for both ignore files:

1build
2node_modules
3.github

You can use cli init command for eslint and prettier config, but here's a ready-to-go scripts:

 1// .eslintrc.js
 2module.exports = {
 3    env: {
 4        browser: true,
 5        es6: true,
 6        node: true,
 7    },
 8    extends: [
 9        'prettier',
10        'prettier/prettier',
11        'eslint:recommended',
12        'plugin:react/recommended',
13        'plugin:react-hooks/recommended',
14        'plugin:prettier/recommended',
15        'plugin:jsx-a11y/strict',
16    ],
17    parser: '@typescript-eslint/parser',
18    parserOptions: {
19        ecmaFeatures: {
20            jsx: true,
21        },
22        ecmaVersion: 2020,
23        sourceType: 'module',
24    },
25    plugins: ['react', 'jsx-a11y', '@typescript-eslint'],
26    rules: {
27        'react-hooks/exhaustive-deps': 'error',
28        'no-var': 'error',
29        'brace-style': 'error',
30        'prefer-template': 'error',
31        radix: 'error',
32        'space-before-blocks': 'error',
33        'import/prefer-default-export': 'off',
34    },
35    overrides: [
36        {
37            files: [
38                '**/*.test.js',
39                '**/*.test.jsx',
40                '**/*.test.tsx',
41                '**/*.spec.js',
42                '**/*.spec.jsx',
43                '**/*.spec.tsx',
44            ],
45            env: {
46                jest: true,
47            },
48        },
49    ],
50};
1//.prettierrc.js
2module.exports = {
3    printWidth: 100,
4    tabWidth: 2,
5    singleQuote: true,
6    semi: false,
7    trailingComma: 'all',
8    arrowParens: 'avoid',
9};

Add these scripts to package.json file:

1"lint": "eslint . --fix",
2"format": "prettier . --write"

Now you are good to run yarn lint and yarn format.

Let's setup git precommit hooks with husky and lint-staged.
Install lint-staged first:

1yarn add --dev lint-staged

Add these lines to your package.json file:

1"lint-staged": {
2    "*.{js,ts,tsx}": [
3        "eslint --quiet --fix"
4    ],
5    "*.{json,md,html}": [
6        "prettier --write"
7    ]
8}

Install and configure husky like so:

1npx husky-init
2yarn
3npx husky add .husky/pre-commit "yarn lint-staged"

That's pretty much it.
Happy coding! :)