flowtypeについて調べた
これまでTypeScriptでの開発ばかりで、Flow(日本だとflowtypeって呼ばれてることが多い)は未経験でした。ついに触ることになりそうなので調べてみました。
Flow(flowtype)
型アノテーションを付与している様子は、TypeScriptとさほど変わらないけど、あくまでFlowはJavaScriptに型アノテーションを付与しているだけという印象が強い。
- FlowはJSの静的型チェッカー
- TSのように型アノテーションを付与する
- ただし、JavaScriptファイルに型アノテーションを付与して、ビルド時にその情報を取り除くだけ
- 型推論も、もちろんある
- 必要なnpmのパッケージ的には、
flow-bin
- お試しはFlow Tryでできる
型チェックの実行
- flow コマンドでFlowのバックグラウンドプロセスが起動して、型チェックを実行
- tsc的な
- JavaScriptファイルに
// @flow
というコメントがあることで、Flowの型チェック対象と伝えることができる- 後述する
// @flow strict
というコメントにすると、Flow Strictを有効にできる
- 後述する
コンパイル
型アノテーションを付与した状態だと、JavaScriptとしては動かないので、ビルド時に型アノテーションを取り除く必要がある。
- Compilersとしては以下の選択肢がある
- Babel(@babel/preset-flow)
- flow-remove-types
設定ファイル
.flowconfig
が設定ファイルflow init
で作成される
- ドキュメントでは、Lintというキーワードとして、色々と設定できる項目が紹介されている
型アノテーション
ざっと以下のドキュメントに目を通して、TypeScriptでよく使うようなものはだいたい揃ってることがわかった。
あとは使ってみて、細かい違いとかは覚えたら良さそう。
細かいメモ
- Maybe型
- Nullableの場合は型の前に
?
をつける - 以下は
string
ornull
orundefined
- Nullableの場合は型の前に
x : ?string
- TS同様にパラメータ名の後に?でOptional
value?: string
- nullチェックやtypeof x === 'string'といったコードを使うことで型を絞れる
- Union 型やIntersectionもTSと同じように使える
- typeofで型を作れるのもTSと同じ
- $ReadOnlyArrayや$ReadOnlyという組み込みの型がある
- $Exactで余剰プロパティを防ぐ
- {| name: string |};は省略記法
- 型でもSpread 演算子がある
type Foo
のように、type aliasもある- Tuple Typesもある
let tuple2: [number, boolean] = [1, true];
TSでいう〇〇は〇〇
- unknownはmixed型
- neverはempty
- readonlyは+
- { +value: boolean }
- keyofは$Keys
- ts-ignoreは// $FlowFixMeなど
- いくつか種類がある
- undefinedはvoid
- type predicatesは
%checks
をつける感じで似てる
flow-typed
- TSでいうDefinitelyTyped
- インストールした型はflow-typedディレクトリに入る
- もし型が無い場合は以下のコマンドで型を作る
- flow-typed create-stub {library}
Flow Strict
Flow Strictを有効にしてより安全性の高いコーディングを行う - Qiita
- ファイル単位でより厳密な型チェックを設定できる
- configに設定する
[strict] nonstrict-import unclear-type unsafe-getters-setters untyped-import untyped-type-import
- ファイルに
// @flow strict
を指定する
React + Flow
ドキュメントが用意されている
- @babel/plugin-transform-react-jsxにも対応している
[options] react.runtime=automatic
- Propsは特に気にするところなく、TSの感じで良さそう
- SyntheticEventなども使える
- ReactからインポートされているReact.Nodeとかの型もOK
VSCode
この拡張を使う
javascript.validate.enable
オプションをfalseにしないと、型注釈についてエラー出る- JSファイルなのに型注釈かけないよ。みたいな
M1 Mac
- なぜか flowコマンドを実行すると、以下の表示で止まった
- Please wait. Server is starting up: -