1 of 27

TypeScript化の旅

Helpfeelが辿った試行錯誤と成功の道のり

2 of 27

3 of 27

自己紹介

Profile

  • 寺本大輝
  • Helpfeel プロダクトエンジニア
  • Gyazo, Scrapboxのファンなので入社
  • Webが好き
  • プロダクトの思想が体現されてるUIが好き
  • JavaScriptは好きではないが、一番書く言語はJavaScript
    • TypeScriptで人生が救われた人間の一人

X (Twitter): @teramotodaiki

3

4 of 27

今日話すこと

Today’s topic

Helpfeelは、いかにしてTypeScript化に成功したか?

  • そもそもHelpfeelとは
  • 結論 〜TypeScript化に必要な3つのポイント〜
  • 既存のJSコードをTS化する難しさ
  • デグレを一切起こさずに型の恩恵を受ける戦略
  • レビューして、議論して、スローガンにする
  • まとめ

4

5 of 27

Helpfeelのビジョン

Vision

Human

Empowerment

Technology

人の好奇心は無限大であり、テクノロジーの可能性も無限に広がっています。

私たちは人にとってスムーズで頼もしい両者の関係を設計することで、

⼈間の思考とコミュニケーションを加速します。

テクノロジーの発明により、人の可能性を拡張する

5

6 of 27

会社沿革

History

Gyazoリリース by 増井

Nota Inc.設立

総額200万ドル

(約2億円)の

資金調達

Scrapbox リリース

黒字化

Helpfeel リリース

5億円の資金調達

ICC SaaS 

カタパルト優勝

株式会Helpfeelに社名変更、CI刷新

6億円の資金調達

グッドデザイン賞受賞

2007

2014

2017

2016

2019

2021

2022

2023

ICCサミット FUKUOKA

総合優勝

シリーズDで20億円の資金調達

累計調達額は33億円に

Helpfeel導入社数200社突破

6

7 of 27

Helpfeelについて

About Helpfeel

検索性に特化し、問題がすぐに解決する「FAQ」を簡単に構築できるシステム。ユーザーが自力で問題を解決するのを手助けするだけでなく、CS担当者やコールセンターの負担も削減します。

2019年IVS LaunchPad出場。2020年Mizuho Innovation Award受賞。

どんな質問でも答えられる

新世代FAQ検索システム

MRR:2022年→2023年は2倍に成長

Helpfeel

検索性能に特化した

新世代FAQ検索システム

全方位で積極採用中!

7

8 of 27

なぜFAQが機能しないのか

Problem of FAQ

検索語彙の違いやタイプミスに対応できず、ユーザーが欲しい答えを見つけらない

8

9 of 27

Helpfeelの革新性

Innovation of Helpfeel

独自の『意図予測検索』技術により、ヒット率98%を実現

従来FAQの50倍に拡張された質問予測パターン

Helpfeelでは質問の予測パターンを50倍以上に拡張し、言葉の違いだけではなく、同じ言葉でも漢字表現とひらがな表現の違い、送り仮名の違い、スペルミスや、感情的、抽象的な表現などにも対応しています。

「質問に対して回答を探す」のではなく

「言葉にマッチする質問を提示する」仕組み

従来のチャットボット等の手法では、1つの質問からそれに当たる答えを1つ探していました(1対1の関係)。そのため大量のデータとチューニングが必要でしたが、Helpfeelは逆に言葉からお客様が意図する「質問を探す」仕組みになっています。

従来のFAQ

Helpfeel

9

10 of 27

Helpfeelの革新性

Innovation of Helpfeel

従来のFAQと比べ1000倍の応答速度と、柔軟な編集環境

従来のFAQと比べ、1000倍の応答速度

言葉から質問を探すアプローチで、文字を入力した瞬間に結果が表示される爆速FAQシステムを構築しています。従来の平均的FAQシステムは約1秒かかっていた応答が、Helpfeelでは、約1000倍高速の0.001秒の応答速度を実現しました。

Scrapboxを使った柔軟な編集環境

答えを探しやすくなっただけではなく、ヘルプページをScrapboxで管理でき、簡単に編集・改善できるようになります。

クライアントサイドで検索が完結している

10

11 of 27

ご利用法人、自治体・サービス一覧

11

公開FAQはhttps://www.helpfeel.com/showcaseにリンクがございますので実際にお試しいただけます

業界のリーディングカンパニー含め300サイト以上で採用されています。

12 of 27

HelpfeelにおけるTypeScript史

History

Helpfeelリリース

初期はCEOがコードの

ほとんどを書いていた

100% JavaScript

社内でTypeScript化の

議論がスタートする

筆者がジョイン

TS化キックオフを実施

進め方を試行錯誤

JSDocで型をつける

最初のTypeScript化

プルリクがマージ

一部のファイルから型を付け始める

2019

2019

2021

2020

2024

優秀な新入社員も続々入社

最新のTypeScriptに追従できる体制が整ってきた

12

13 of 27

結論

Conclusion

注意

今から身も蓋もないことを言います

TypeScript化を成功するために必要な3つのポイント

13

14 of 27

結論

Conclusion

  • TypeScriptが書ける優秀な人材
  • 協力的なチーム
  • 導入推進者の気合

TypeScript化を成功するために必要な3つのポイント

14

15 of 27

もうちょい現実的な戦略やテクニック

  • 既存のJSコードをTS化する難しさ
  • コードをTS化する2つの戦略
  • レビューして、議論して、スローガンにする

15

16 of 27

既存のJSコードをTS化する難しさ

  • デグレが起きるリスク
  • 間違った型をつけるリスク

その結果…

  • レビューが大変

しかも、(直接的には) 利益に繋がらない

まずは前提として、何が難しいのか考える

型アノテーションだけなら振る舞いに影響を与えないが、誰もがそう上手く安全に型付け出来る訳ではない

リファクタリング欲に抗えない

例) arrayとstring

16

17 of 27

JSDocで型を書き込む

拡張子は .js のまま、コメント文として型アノテーションできる

 →振る舞いに影響を与えない

   →絶対にデグレしない

checkJs: true にすれば、tscで静的型検知してくれる

TypeScriptには、絶対デグレを起こさずに型をつける方法が用意されている

17

18 of 27

TypeScriptにおける位置づけ

TypeScriptの型レベルには、5段階の厳密さがある (筆者による意訳)

  1. JavaScriptコードによる型推論
  2. JSDocを使って型定義を追加する
  3. JavaScriptのまま、tscによる型チェックを有効化する
  4. TypeScriptコード
  5. strict modeが有効化されたTypeScriptコード

まずはこの段階に行く

最終的にはここに行く

18

19 of 27

既存のJSコードをTSに変えていく2つの戦略

型安心な領域を作って少しずつ拡げていく戦略

デグレを起こさず一気に型安心にする戦略

  • プルリクを1個ずつ出す
  • 進捗を測りやすい
  • 一般的な方法
  • .jsのままJSDocに型を書く
  • 素早く、デグレしづらい
  • あまり知られていない?

v.s.

19

20 of 27

既存のJSコードをTSに変えていく2つの戦略

デグレを起こさず一気に型安心にする戦略

  • .jsのままJSDocに型を書く
  • 素早く、デグレしづらい
  • あまり知られていない?

具体的な進め方

  • checkJs: true にする
  • エラーを全部直す�(Helpfeelでは当時400個出た)

→型の恩恵を受けられる状態になる

  • 型の恩恵を受けつつ、ゆっくりTypeScript化していく

20

21 of 27

最初の型エラーとの戦い方

@ts-expect-errorで逃げる

例えばこういうケース

  • process.env.MY_SECRET_KEY is possibly ‘undefined’
  • Object is possibly 'null'

実はそもそもの実装が間違っていることもしばしば

型エラーを直すのではなく、型エラーが起きていることを明示する

@ts-expect-error (型エラーが起きている理由)

次の行にエラーがあることをアサーションする

(エラーがなければエラーになる)

21

22 of 27

コラム

TypeScript の静的解析はプロジェクト全体で協調動作しているから、周辺が型安心であればあるほど、その型の正しさを保証してくれる

1ヶ所でしか使われないその場限りの型定義は間違っている可能性が高いが、10ヶ所から参照されている型定義は合っている可能性が高い

これはクロスワードパズルによく似ている

クロスワードパズルは一問解けても正解かどうか分からない

クロスする問題が解けたとき、相補的に正解である確率が高まる

型付けはクロスワードパズルに似ている

22

23 of 27

レビューして、議論して、スローガンにする

一口に「TypeScript化する」と言っても、書き方には幅がある

  • 型アサーションを多用しない
  • TypeScript の export は変数宣言につける方が良いと思う
  • React.FunctionComponent 型は省略して良い
  • type-only import を使うかどうか
  • TypeScript では window. を付けた方が良い
  • TypeScript のメンバー変数はコンストラクタで初期化する
  • グローバルに型を宣言する
  • TypeScript で for of が使えないオブジェクトをどうにかする
  • Object.freeze の戻り値が readonly になって代入できない問題
  • TypeScript でテストケースが型エラーになる問題
  • TypeScript で process.env をどう扱うか
  • JSDoc の Mapped Object は JSDoc standard syntax で書くと良い
  • Asearch の曖昧度の型は number と Union どちらを使うべきか

23

24 of 27

レビューして、議論して、スローガンにする

24

25 of 27

レビューして、議論して、スローガンにする

議論が起きることは健全

同じ議論が再び繰り広げられないようにする

  • (Scrapboxに) ページを立てる
  • Lintでチェックする

25

26 of 27

まとめ

TypeScript化を成功するために必要な3つのポイント

  • TypeScriptが書ける優秀な人材
  • 協力的なチームメンバー
  • 導入推進者の気合

それ以外のテクニック

  • JSDocで型を書くといいよ
  • @ts-expect-error で逃げるといいよ
  • 細かいルールは作りながら決めて言語化していこう

26

27 of 27

☆俺達の戦いはまだまだこれからだ!!!

Helpfeel Tech Conf 2024やります!

  • 2024年8月25日 (日)
  • みんな来てね!!

TSKaigi 2024 After Talkやります!

  • 2024年6月4日(火)19:00~
  • @LayerXオフィス
  • 今日話せなかったことを話します

27