73
56

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Flow導入時に最初にやることまとめ

Last updated at Posted at 2017-03-21

備忘録的に。

flow-typed をグローバルインストール

参考:Flow | Checking third-party code

flow-typed という CLI があり、package.json があるディレクトリでこのコマンドを使うと React などサードパーティのライブラリに対する型定義ファイルを探してダウンロードしてくれる。

$ npm i -g flow-typed

これはプロジェクトごとではなく端末ごとに一度実行すれば OK。

Flow をインストール

プロジェクトで

$ npm i -D flow-bin

ついでに flow コマンドを使えるよう package.json に追記しておく。

   "scripts": {
     "webpack": "webpack --progress --colors --watch",
     "start": "webpack-dev-server --inline --hot",
+    "flow": "flow",
     "lint": "eslint src",
     "test": "echo \"Error: no test specified\" && exit 1"
   },

初期化(.flowconfig ファイルを作成)

$ ./node_modules/.bin/flow init

プロジェクトルートに .flowconfig というファイルが生成されているはず。
node_modules を除外するように設定しておく。

.flowconfig
[ignore]
.*/node_modules/.*

[include]

[libs]

[options]

Babel プラグインをインストール

トランスパイル時に Flow の型定義を取り除くために必要。

$ npm i -D babel-plugin-transform-flow-strip-types
webpack.config.js
         query:{
-          presets: ['react', 'es2015', 'react-hmre']
+          presets: ['react', 'es2015', 'react-hmre'],
+          plugins: ['transform-flow-strip-types'],
         }

eslint-plugin-flowtype のインストール

https://github.com/gajus/eslint-plugin-flowtype
Flow の型定義つきの JS を ESLint に通すために必要。
parser を babel-eslint に変更する必要あり。

$ npm i -D babel-eslint eslint-plugin-flowtype
.eslintrc
 {
+  "parser": "babel-eslint",
   "extends": "airbnb",
+  "plugins": ["flowtype"],
   "rules": {
     ...
   }
 }

ESLint の no-duplicate-imports ルールを無効にする

参考:no-duplicate-imports rule for Flow type imports · Issue #59 · babel/eslint-plugin-babel
import type で import する型定義のモジュール名と通常のモジュール名がかぶったときにエラーになってしまうので、無効にする。
なお同等のチェックは eslint-plugin-import の no-duplicates というルールでチェックされるので問題なし。

eslint-plugin-flowtype のルールを調整

参考:FlowtypeのUtility TypesでESLintエラーを出さないようにする - dackdive's blog

そのままだと Flow の Utility Types$Shape とか)で no-undef エラーが出るため、 .eslintrc に以下を追記する。

.eslintrc
   "rules": {
      ...
+    "flowtype/define-flow-type": 1,
+    "flowtype/use-flow-type": 1,
   }

flow-typed で Redux, react-redux の型定義ファイルをインストール

参考:flow-typedで外部ライブラリの型定義を使う - Qiita
こちらにあるように、

$ flow-typed search redux

で型定義ファイルを検索した後、

$ flow-typed install redux@3

のように @ 以降でバージョンを指定しつつインストール。
(flow-typed@2.0.0 では @ 以降の数字は省略できました)
実行すると flow-typed/npm/ というディレクトリと、その下に定義ファイルが生成されている。

※または

$ flow-typed install

のように引数なしでインストールすると package.json を解釈して自動的に関係のある型定義をダウンロードしてくれるみたい。

• Found flow-bin@v0.39.0 installed. Installing libdefs compatible with this version of Flow...
• Found 20 dependencies in package.json. Searching for libdefs...
• flow-typed cache not found, fetching from GitHub...done.
• Installing 3 libdefs...
  • flow-bin_v0.x.x.js
    └> ./flow-typed/npm/flow-bin_v0.x.x.js
  • react-redux_v4.x.x.js
    └> ./flow-typed/npm/react-redux_v4.x.x.js
  • redux_v3.x.x.js
    └> ./flow-typed/npm/redux_v3.x.x.js
• Generating stubs for untyped dependencies...
  • file-loader@^0.9.0
    └> flow-typed/npm/file-loader_vx.x.x.js
  • babel-preset-es2015@^6.18.0
    └> flow-typed/npm/babel-preset-es2015_vx.x.x.js
  • babel-preset-react@^6.16.0
    └> flow-typed/npm/babel-preset-react_vx.x.x.js
  • babel-eslint@^7.1.0
    └> flow-typed/npm/babel-eslint_vx.x.x.js

なんかこんな感じでつらつらと出てくるはず。
ただし、• Generating stubs for untyped dependencies... 以下のファイルは型定義が存在しないパッケージのようで、Stub と呼ばれる無駄なファイルが大量に生成されてしまう。

この Stub を生成しないようなオプションが最近追加された?未確認。
Add an option to skip stubs when installing by lime · Pull Request #686 · flowtype/flow-typed

準備完了!

あとはプロジェクトに合わせて型を書いていく。
React/Redux 系プロジェクトだともう少し共通でやることがありそうなので、わかったら追記する。

73
56
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
73
56

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?