[ESLint] React hook + Typescript ํ”„๋กœ์ ํŠธ ์‹œ ์„ค์ •ํ•œ rule ๊ณต์œ 
module.exports = {
	'parser': '@typescript-eslint/parser',
	'plugins': ['@typescript-eslint'],
	'env': {
		'commonjs': true,
		'browser': true,
		'es2021': true,
		'node' : true
	},
	'extends': [
		'airbnb',
		'airbnb/hooks',
		'plugin:@typescript-eslint/recommended'
	],
	'parserOptions': {
		'project': './tsconfig.json',
		'ecmaFeatures': {
			'jsx': true,
		},
		'ecmaVersion': 12,
		'sourceType': 'module',
	},
	'rules': {
		'indent': [
			'error',
			'tab',
		], // indent๋Š” tab์œผ๋กœ ํ†ต์ผ
		'react/jsx-indent' : [2, 'tab'], // jsx์—์„œ๋„ indent tab์œผ๋กœ ํ†ต์ผ
		'react/jsx-filename-extension': [1, { 'extensions': ['.js', '.jsx', '.ts'] }], // ํ™•์žฅ์ž ์„ค์ •
		'linebreak-style': ['error', 'windows'], // CRLF
		'no-unused-vars': 'warn', // ์ •์˜ ํ›„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ๋ณ€์ˆ˜๋Š” ๊ฒฝ๊ณ ๋งŒ ํ•˜๊ธฐ
		'no-use-before-define': 1, // ์ •์˜ ์ „์— ์‚ฌ์šฉ ๊ธˆ์ง€
		'no-console': 0, // console ์‚ฌ์šฉํ•˜๊ธฐ
		'camelcase': ['error', { 'properties': 'always' }], // ์†์„ฑ์— camelcase ์‚ฌ์šฉ
		'no-tabs': 0, // tab ์‚ฌ์šฉ ์•ˆ๋˜๋Š” rule
		'quote-props': 0, // property์— quote๋ฅผ ์”Œ์šฐ์ง€ ๋ง์•„์•ผํ•˜๋Š” rule
		'operator-linebreak': 0, // ์—ฐ์‚ฐ์ž๋Š” ๋ผ์ธ ์•ž์ชฝ์— ์œ„์น˜ํ•ด์•ผํ•˜๋Š” rule
		'comma-dangle': 0, // ๋งˆ์ง€๋ง‰ ์š”์†Œ์— ,๋ฅผ ๋ถ™์—ฌ์•ผํ•˜๋Š” rule
		'no-param-reassign': 0, // ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์ง€์—ญ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„์„œ ์“ฐ๋ผ๋Š” rule
    	'import/prefer-default-export': ['off'], // export const ๋ฌธ์„ ์“ธ๋•Œ ์—๋Ÿฌ๋ฅผ ๋‚ด๋Š” rule ํ•ด์ œ
		'react/prop-types': ['off'], // props์˜ ํƒ€์ž…์ฒดํฌ๋ฅผ ์ฒ˜๋ฆฌ์— proptypes๊ฐ€ ์•„๋‹Œ typescript ์‚ฌ์šฉ ์˜ˆ์ •
		'react/jsx-wrap-multilines': 0, // jsx์—์„œ ์—ฌ๋Ÿฌ ์ค„์— ๊ฑธ์ณ์„œ ์ •์˜ํ•  ๋•Œ ๋ณต์žกํ•œ rule ํ•ด์ œ
		'react/jsx-indent-props': [2, 'tab'], // jsx์˜ ์†์„ฑ์—๋„ tab์œผ๋กœ indent ์ ์šฉ
		'@typescript-eslint/explicit-module-boundary-types': 0, // function์— return ํƒ€์ž…์„ ๋ช…์‹œํ•ด์•ผํ•˜๋Š” rule ํ•ด์ œ
		'import/extensions': 0, // ts ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์œ„ํ•ด
		'react/jsx-filename-extension': 0, // ts, tsx ํŒŒ์ผ์—์„œ๋„ jsx๋ฅผ ์“ฐ๊ธฐ ์œ„ํ•ด
		'no-restricted-syntax': ['warn', 'FunctionExpression', 'WithStatement', 'BinaryExpression'], // for in ์‚ฌ์šฉ
		'react/jsx-props-no-spreading': ['warn'], // props๋กœ ๋ฐ›์€ ๊ฒƒ ๋ฐ”๋กœ props๋กœ ๋„˜๊ธฐ๊ธฐ ํ—ˆ์šฉ
	},
	'settings': {
		'react': {
			'version': 'detect',
		},
		'import/resolver': {
			'node': {
				'extensions': ['.js', '.jsx', '.ts', '.tsx']
			}
		}
	},
};

 

๋ฐ˜์‘ํ˜•