アソビュー Advent Calendar 2019の2日目。
フロントエンドエンジニアの指田です。
今回はアソビューの既存ReactプロジェクトにTypeScriptを導入した内容についてお話します。
はじめに
Babelでコンパイルしている既存ReactプロジェクトにTypeScriptを導入した話です。
本記事ではTypeScript等の説明は致しません。
導入
- 既存のビルド構成は変更しない。(@babel/preset-typescriptを利用。
ts-loader
は使用しない) - 導入直後はコード変更もしない。
- 完全にTypeScriptにするまでJavaScriptとTypeScriptは混在する。
インストール
JavaScript Standard Styleを利用しているため、Typescriptのconfigも追加してます。
# TypeScript yarn add -D typescript # Babel yarn add -D @babel/preset-typescript # ESLint yarn add -D @typescript-eslint/eslint-plugin @typescript-eslint/parser eslint-config-standard-with-typescript
設定
最初の設定は悩みました。
設定を厳しくしすぎると、開発が進まなくなるので必要そうな設定のみで導入しました。
TypeScript
初期はallowJs
(JavaScriptもトランスパイルに含めるかどうか)は外して導入してます。
{ "compilerOptions": { "skipLibCheck": true, "isolatedModules": true, "esModuleInterop": true, "strict": true, "noImplicitAny": false, "noImplicitThis": true, "strictNullChecks": true, "noImplicitReturns": true, "noUnusedLocals": true, "noUnusedParameters": true, }, }
ESLint
overrides
を使用してJavaScriptもTypeScriptも同じ様にlintが効くようにしてます。
{ "env": { "browser": true, "jest": true }, "extends": [ "standard", "standard-with-typescript", "standard-jsx", "plugin:react/recommended", "plugin:css-modules/recommended" ], "plugins": [ "react-hooks", "css-modules" ], "rules": { "react/prop-types": 0, "standard/computed-property-even-spacing": "off", "react-hooks/rules-of-hooks": "error" }, "parser": "babel-eslint", "settings": { "react": { "version": "detect" }, "node": { "tryExtensions": [".ts", ".tsx", ".js"] }, }, "overrides": [ { "files": ["*.ts", "*.tsx"], "plugins": [ "@typescript-eslint", "react-hooks", "css-modules" ], "parser": "@typescript-eslint/parser", "parserOptions": { "sourceType": "module", "project": "./tsconfig.json" }, "rules": { "@typescript-eslint/explicit-member-accessibility": "off", "@typescript-eslint/explicit-function-return-type": "off", "@typescript-eslint/promise-function-async": [ "error", { "allowedPromiseNames": [], "checkArrowFunctions": false, "checkFunctionDeclarations": true, "checkFunctionExpressions": false, "checkMethodDeclarations": false } ] } } ] }
prettier
{ "overrides": [ { "files": ["*.ts", "*.tsx"], "options": { "parser": "typescript" } } ] }
npm script
JavaScriptも含めたチェックできるtscコマンドも用意しました。
{ "scripts": { "ts-compile-check": "tsc -p tsconfig.json --noEmit", "ts-compile-check-in-js": "tsc -p tsconfig.json --noEmit --allowJs", }, }
型について
導入直後はanyまたは未指定で進めました。
型を定義していない状態は意味があるのか?とは思いますが、
引数の誤り、不要なPropsがなくなるのでコードがきれいになるメリットがあります。
まとめ
- 既存コードがある場合、初期の導入範囲はなるべく小さくすることをおすすめします。
- Babelを使用しているのであれば、@babel/preset-typescriptを利用する方が早めに導入できると思います。
- ESLint等の設定は
overrides
を利用し、混在しても問題ないようにするのがいいと思います。
最後に
アソビューではTypeScriptを導入したプロジェクトはまだ少数なので全てのReactプロジェクトへ導入を検討して行きたいです。