Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Flow は今どうなっているか

Avatar for mizdra mizdra PRO
August 13, 2026

Flow は今どうなっているか

2026/07/24 に TSKaigi Mashup Kansai #2 で発表した資料です。

Avatar for mizdra

mizdra PRO

August 13, 2026

More Decks by mizdra

Other Decks in Programming

Transcript

  1. コード例 // @flow function greet(name: string, age: number): string {

    return `Hello, ${name} (${age})`; } type User = { name: string, age: number }; const user: User = { name: "mizdra", age: 20 }; greet(user.name, user.age); greet(42, "oops"); // Error! 5
  2. 今の Flow • Meta 社内では使われている • 今も開発が続き、進化してる • 実は TypeScript

    にも影響を与えてる どのように進化しているのかについて話します 7
  3. Flow の型 • TypeScript と大体同じ ◦ 基本型 (boolean, number, string,

    null, ...) ◦ keyof T, as const, T[K], A & B, x as T ◦ ユーテリティ型 (Pick, Omit, ...) • 型注釈書く場所も同じ 9
  4. 特筆すべき相違点 • void, empty • Exact object • Nominal classes

    • object/interface/class の subtyping 関係 10
  5. Exact object • {x: number} 型はプロパティ x のみ含む型 type A

    = {x: number}; const obj = {x: 1, y: 2}; const a: A = obj; // ERROR 12
  6. Exact object • 追加のプロパティを許可するには... ◦ {x: number, ...} と書く type

    A = {x: number, ...}; const obj = {x: 1, y: 2}; const a: A = obj; // OK 13
  7. Nominal classes • class は nominal type として扱われる class Foo

    { a: number = 1; } class Bar { a: number = 1; } const foo: Foo = new Bar(); // ERROR 14
  8. モジュール境界の型注釈の必須化 (2020) • export するやつは明示的な型注釈が必要 (※1) // NG export function

    add(a: number, b: number) { return a + b; } // OK export function add(a: number, b: number): number { return a + b; } ※1: 厳密には、`export const VAL = 100;` のような ASTをパースすれば 型が分かるものは型注釈省略可能 19
  9. 実は TypeScript に輸出されてる • モジュール境界の型注釈の必須化は... ◦ TypeScript の --isolatedDeclarations に相当

    • 実装者が公演で「Flowを参考にした」と言ってる ◦ https://gitnation.com/contents/faster-typescriptbuilds-with-isolateddeclarations 21
  10. 機能の輸入もしてる • Type Guard • Mapped Type • Conditional Types

    • リテラル型, as const, const 型パラメーター 23
  11. ① component 構文 component Profile(name: string, age: number) { return

    <div>{name}({age}歳)</div>; } • パラメーター部分を短く書ける ◦ TS だと ({name, age}: {name: string, age: number}) 25
  12. ② hook 構文 hook useWindowWidth(): number { // ... return

    width; } • 型で hook と通常の関数を区別するためのもの ◦ より多くの問題を静的に検出できる ◦ function が hook になってるだけ 26
  13. ③ match 式 const message = match (result) { {type:

    'ok', const value} => `成功: ${value}`, {type: 'error', const error} => `失敗: ${error.message}`, {type: 'loading'} => '読み込み中...', }; 27
  14. 何故拡張構文を追加しているのか • 近年 TypeScript では拡張構文を実装しない方針 • 一方 Flow は... ◦

    2021 年に拡張構文を許容するように (※2) ◦ Meta 社内のニーズに応じて構文の拡張も検討する • TypeScript と正反対で面白い ※2: https://medium.com/flow-type/clarity-on-flows-direction-and-open-source-engage ment-e721a4eb4d8b 28
  15. 型チェッカーの Rust 化 (2026) • 型チェッカーが OCaml => Rust に

    ◦ 型チェックが概ね2倍速に • TS のように Go への移植も検討されたが... ◦ SWC や oxlint といったツールへの結合も検討したい ◦ 移植は大変なので、二度と後悔しない言語選択をしたい ◦ => Rust を選択することに 29
  16. まとめ • Meta 社内以外では殆ど使われなくなったが... ◦ Flow は今も進化してる • 野心的な変更が次々行われてる ◦

    TypeScript との互換性向上 ◦ 型チェックのパフォーマンス向上 ◦ 拡張構文 • 今後の進化にも是非注目しよう 30