FlowからTypeScript型への変換 — Numio
Khan Academy の flow-to-ts を使って、Flow の型が付いたコードを TypeScript に変換します。Maybe 型(?T)は T | null | undefined に、厳密なオブジェクトは通常のオブジェクト型に、$ReadOnlyArray は ReadonlyArray になります。
Flow のコードベースをファイル単位で TypeScript に移行しており、各モジュールの最初の変換を済ませたい場合。
Flow
TypeScript
こんなときに使えます
- Flow のコードベースをファイル単位で TypeScript に移行しており、各モジュールの最初の変換を済ませたい場合。
- 古い React プロジェクトにある Flow の型付きスニペットを、TypeScript のコードベースに貼り付ける必要がある場合。
使い方
- Flow パネルに Flow のコードを貼り付けます。
- コードは /api/flow-to-typescript に送信され、サーバー上で flow-to-ts により変換されます。設定項目はありません。
- TypeScript をコピーして .ts または .tsx として保存し、tsc を実行して変換しきれなかった箇所を修正します。
Flow
// @flow
import type { Node } from 'react';
export type User = {|
+id: number,
name: ?string,
roles: $ReadOnlyArray<string>,
|};
export function greet(user: User): string {
return `Hi ${user.name ?? 'guest'}`;
}
export const render = (title: string): Node => null;TypeScript
import type { Node } from "react"
export type User = {
readonly id: number
name: string | null | undefined
roles: ReadonlyArray<string>
}
export function greet(user: User): string {
return `Hi ${user.name ?? "guest"}`
}
export const render = (title: string): Node => null仕様と制限
入力は変換のためにサーバーのルート(/api/flow-to-typescript)に送信されます。ブラウザ内だけで処理されるわけではありません。Next.js の API ルートが受け付けるリクエストボディは、デフォルトで 1 MB までです。
TypeScript には厳密なオブジェクトがないため、厳密なオブジェクト型 {| |} は厳密さを失います。+prop は readonly になります。
$ReadOnly や $Keys などの Flow のユーティリティ型は名前がそのまま残り、npm パッケージ utility-types からインポートされるため、そのパッケージをインストールする必要があります。
// @flow プラグマは削除され、コードは出力し直されます。Node などの React の型インポートは書かれたまま残るため、名前(例: ReactNode)は自分で変更してください。
FAQ
Maybe 型はどう変換されますか?
name: ?string は name: string | null | undefined になります。省略可能なプロパティ(name?: T)は省略可能のままです。
JSX のファイルも変換できますか?
はい。JSX は残るので、結果は .tsx として保存してください。
完全なコードではなく .d.ts だけを得られますか?
このページではできません。Flow to TypeScript Declaration は同じサーバーのルートを declarationOnly 付きで使い、宣言だけを出力します。