TypeScript使いがRustを触った理由

TypeScriptを5年以上書いてきた自分が、なぜRustに手を出したのか。理由はシンプルで、「パフォーマンスと信頼性の両立を本当に理解したかった」からだ。

最初に驚いたこと:所有権

Rustで最初に壁になるのが所有権システムだ。

let s1 = String::from("hello");
let s2 = s1; // s1 はここで無効になる

println!("{}", s1); // コンパイルエラー

TypeScriptでは参照の共有が当たり前なので、これは直感に反する。しかし慣れると、メモリ安全性がコンパイル時に保証されることの意味がわかってくる。

TypeScriptとの概念対比

| TypeScript | Rust | 備考 | | -------------------- | ----------------------------------- | -------------------------- | | null / undefined | Option<T> | null安全性の強制 | | try/catch | Result<T, E> | エラー処理の型安全 | | interface / type | struct + trait | 型システムの設計思想の違い | | any | なし(Box<dyn Any> は存在するが) | 型消去を強制しない設計 |

型システムの「強さ」の違い

TypeScriptの型システムは強力だが、実行時にはJavaScriptになる。つまり型は開発時のヒントであり、実行時の保証ではない。

Rustの型システムは実行時にも有効だ。Option<T>None をハンドルしなければコンパイルエラーになる。この「コンパイルが通れば動く」という信頼感は、TypeScriptとは別次元だ。

学習コストについて正直に言う

Rustの学習コストは高い。特に以下の3つは時間がかかる。

  1. 所有権・借用・ライフタイム — 概念理解に1〜2週間
  2. エラー処理パターンResult の使い方に慣れるまで
  3. 非同期処理async/await はあるが、Tokioとの組み合わせが独特

ただし、これらを乗り越えた先に見える景色は確かに違う。

今後の使い道

個人的には以下の用途でRustを使っていく予定だ。

  • CLIツールの開発
  • Cloudflare Workers でのEdge処理
  • パフォーマンスクリティカルなAPIバックエンド

TypeScriptとRustは競合ではなく、使い分けの問題だ。両方を使えるエンジニアは、選択肢の幅が明らかに広がる。