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

静的型なきJS界を救う英雄たちの話

 静的型なきJS界を救う英雄たちの話

大正Geek Vol.2 での発表資料です。
https://taisho-geek.connpass.com/event/89869/

Flow と TypeScriptを同時につかってみる話です。
補足ですが、この遊びをしているときに、 TypeScript側にstrictNullCheckをつけ忘れるというミスがありました。つまり、例としてあまりよくありません。ご注意ください。

# 解説
https://blog.eiel.info/blog/2018/06/13/taisho-geek-vol2/

# 関連

- FlowのドキュメントにあるコードをひたすらTypeScriptのPlaygroundで試す
- https://qiita.com/eielh/items/21168709edf2813acdcc

Tomohiko Himura

June 13, 2018
Tweet

More Decks by Tomohiko Himura

Other Decks in Programming

Transcript

  1. $ flow Error ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ ┈┈┈┈┈┈┈┈┈┈ src/index.ts:6:6 Cannot call hoge with

    undefined bound to hoge because: • Either property x is missing in undefined [1] but exists in Hoge [2]. • Or undefined [1] is incompatible with null [3]. src/index.ts 3│ 4│ hoge({x: 1, y: 2}) 5│ hoge({x: 1, y: 2, z: 3}) [1] 6│ hoge(undefined) 7│ src/Hoge.ts [2][3] 7│ export const hoge = (hoge: Hoge | null): Hoge => {
  2. $ tsc src/index.ts:5:19 - error TS2345: Argument of type '{

    x: number; y: number; z: number; }' is not assignable to parameter of type 'Hoge'. Object literal may only specify known properties, and 'z' does not exist in type 'Hoge'. 5 hoge({x: 1, y: 2, z: 3}) ~~~~
  3. 今回の例のポイント • Maybeがない(TS) • Hoge | null で代用した • しかし、TSでは

    undefined もnull扱い • 文法の競合で型のimportができない • できることはできる(しかし、使えない) • データ定義 • interfaceを使うしかない • classを使ったとき挙動が違う • object type使ったときの挙動が違う • 関数は問題ない
  4. 雑な感想 • TypeScript • クラス中心 • でも、JSも活かす • アノテーションないならany •

    Flow • オブジェクト中心 • クラス使うなら構造が同じでも別の型 • アノテーションなくても検査