FlowからVanilla JavaScriptへの変換 — Numio
Babel の flow-strip-types プラグインで Flow の型注釈を取り除き、プレーンな JavaScript を出力します。型のみのインポートと型エイリアスは削除され、その後ページが Prettier で結果を整形します。
プロジェクトから Flow を外す作業中で、TypeScript に移行するかを決める前に、まずプレーンな JavaScript がほしい場合。
Flow
JavaScript
処理はブラウザ内で行われ、入力はアップロードされません。同じタブでツールを切り替えると入力が残る場合があります。共有端末では使用後に消去してください。
こんなときに使えます
- プロジェクトから Flow を外す作業中で、TypeScript に移行するかを決める前に、まずプレーンな JavaScript がほしい場合。
- Flow の型が付いたスニペットを、ブラウザーのコンソールや codepen など標準の JavaScript しか受け付けない場所に貼り付ける必要がある場合。
使い方
- Flow パネルに Flow の注釈付きコード(// @flow ヘッダーの有無は問いません)を貼り付けます。
- コードは /api/flow-to-javascript に送信され、recast が Flow パーサーで解析し、Babel が型を取り除きます。
- 出力パネルから JavaScript をコピーします。
Flow
// @flow
import type { Store } from './store';
import { createStore } from './store';
type State = { count: number };
export function first<T>(items: Array<T>): ?T {
return items.length ? items[0] : null;
}
const store: Store<State> = createStore(({ count: 0 }: State));
export default store;JavaScript
import { createStore } from "./store"
export function first(items) {
return items.length ? items[0] : null
}
const store = createStore({
count: 0,
})
export default store仕様と制限
入力は変換のためにサーバーのルート(/api/flow-to-javascript)に送信されます。ブラウザ内だけで処理されるわけではありません。Next.js の API ルートが受け付けるリクエストボディは、デフォルトで 1 MB までです。
取り除かれるのは型だけです。JSX、??、クラスフィールドなどのモダンな構文はトランスパイルされません。
結果は Prettier で整形し直される(ダブルクォート、セミコロンなし)ため、元のスタイルは保持されません。({ count: 0 }: State) のような型キャストでは余分な括弧も消えます。
削除される型宣言に付いている // @flow コメントは、一緒に削除されます。
FAQ
JSX は残りますか?
はい。JSX は解析されてそのまま出力されるため、結果を実行するには引き続き JSX の変換が必要です。
import type 文はどうなりますか?
完全に削除されます。通常の import はそのまま残ります。
出力の実行に Flow や Babel は必要ですか?
Flow は不要です。入力で JSX や新しい構文を使っている場合は、実行環境やバンドラーがそれに対応している必要があります。