TypeScriptで書ける型安全なRuby on Railsを求め、ORMの開発を始めた

私はAccel Recordという、TypeScript用ORMライブラリを開発しています。
このライブラリについては、先日[Active Recordパターンを採用したTypeScript用ORM「Accel Record」の紹介](https://qiita.com/koyopro/items/917c2c98db3de7518849)という記事を公開しました。

次に、なぜTypeScript用ORMを新たに開発しようと思ったかを書いてみようと思います。

### 追記 (2025/04/14)

開発状況のアップデートについて、以下の記事もぜひご覧ください。

[型のある Rails が欲しいと思い開発を始めてから１年、TypeScript 向けフレームワークを公開しました - Qiita](https://qiita.com/koyopro/items/c61374c77254be4ce971)

## 最初の動機

普段Ruby on Railsを使ってサーバーサイド開発、TypeScriptを使ってフロントエンド開発をしていると、以下のように感じることがあります。

- **TypeScriptにもRuby on Railsくらい開発効率の高いフレームワークが欲しい**

これはまず「サーバーサイド開発においてもTypeScriptを使いたい」という気持ちがあるということです。それは主に次のような理由があります。
- サーバーサイドも型安全に開発したい
- フロントエンドとバックエンドを同じ言語で開発し、コンテキストスイッチや学習コストを少なくしたい

このような考えはよくあると思われ、実際これらを理由にサーバーサイド開発にTypeScriptを採用する事例も聞きます。

## どんなフレームワークが欲しいのか？

では「_Ruby on Railsくらい開発効率の高いフレームワーク_」とは、どのようなものを指すのでしょうか？

ここで求められる要件は人によって違うかもしれませんが、私の場合は次のように考えました。

- Webアプリケーション開発でよくあるユースケースの機能を、少ない記述量で実現できること

もう少し具体的には、以下のような要素を求めています。

- (SPAではなく)SSRで動くMPAの開発をベースとして
- 特にRDBに対するCRUD関連の機能を少ない記述量で実現できる
- サーバーサイドにおけるMVCの領域をカバーするフレームワーク

そのような要素を持つフレームワークがあれば、TypeScriptでもRuby on Railsを使うときと同等以上の効率でサーバーサイド開発をすることができるのではと考えました。

## 既存のフレームワークでは十分に思えなかった

前項で述べたような要件を満たすフレームワークが既に存在するのか、調べてみました。
その結果感じたのは、Railsのようにサーバーサイドの処理を効率よく、記述が少なく書けるような機能を提供するTypeScriptのフレームワークは無いのではないか、ということでした。

(かなり大雑把な表現にはなりますが、)既存のTSのフレームワークは、ルーティングや、フロントエンド/バックエンドの連携を強化するような機能に重点が置かれているような印象を受けました。MVCでいうとViewやController関連の機能は充実していますが、Model部分の機能がRailsと比べると弱いのではないかということです。

## Active RecordのようなORMが必要なのではないか？

RailsでModelの役割を主に担うのがORMにあたるActive Recordです。
もちろんTypeScriptでもORMは存在しますが、RailsのActive RecordはただのORMではありません。DBのレコードに対する操作だけでなく、対応するドメインモデルに関する様々な機能を提供します。

Railsは、一般的な機能を少ない記述量で実現できるところが特徴です。そしてそれは、Active Recordが提供するモデルクラスが多くの機能を持っているからこそ実現できているのではないでしょうか。ルーティングやコントローラーといった他の部分と強く連携し、それによって高い開発効率が実現されています。

以上の観点から、目的を達成するためにはTypeScriptにもRailsのActive Recordと役割の近い、高機能なORMが必要なのではないかと思いました。

## ORMにはどのような要素が必要か？

Railsのように効率的な開発体験をTypeScriptで実現するためには、次のような要素を持つORMが欲しいと考えました。

### 1. Active Recordパターン

Active RecordパターンのORMであってほしいです。1つのクラスでDBのレコードに対する操作だけでなく、対応するドメインモデルに関する機能を持たせたいためです。
例えばテーブルゲートウェイパターンのORMだと、取り出したレコードがプレーンなオブジェクトであるため、モデルに関する機能をメソッドとして持たせることが難しくなります。
また、Railsで行われているようなルーティングやView等の機能との連携もActive RecordパターンのORMである方が実現しやすいと考えました。

### 2. 型安全性

TypeScriptの利点を活かし、ORMの操作やクエリインターフェースは、型安全であってほしいです。
そもそもの動機が「サーバーサイドも型安全に開発したい」というところから出発しているので、型のサポートが十分にあることが期待されます。

## 条件を満たす既存のORMは見つからなかった

上記の内容を踏まえて既存のORMを調査してみましたが、Active Recordパターンで型安全なORMは見つかりませんでした。

例えば最近勢いのある[Prisma](https://www.prisma.io)は、型安全性は高いですがActive Recordパターンではなくテーブルゲートウェイパターンを採用しています。
最も期待値に近いのはActive Recordパターンを利用できる[TypeORM](https://typeorm.io)ですが、型のサポートが最近のORMと比較すると弱いことと、直近はリリース頻度が低いことが懸念されました。

## ORMを開発してみることにした

上記の経緯から、私は「Active Recordパターンを採用し型安全なTypeScript用ORM」の開発を始めてみることにしました。
試しに作ってみて、そもそもそのようなものが実現できそうか、難しそうなのであればどのような課題があるのか、を確かめたいと思いました。

この後の開発経緯についてはまた別の記事にまとめる予定ですが、最終的には新しいORMを[Accel Record](https://www.npmjs.com/package/accel-record)として公開するに至りました。

## まとめ

この記事では、なぜTypeScript用ORMを新たに開発しようと思ったかを整理しました。

最初の動機は「TypeScriptでRuby on Railsのような開発効率の高いフレームワークが欲しい」というものです。そして既存ライブラリの調査を進めていくうちに「Active Recordパターンを採用し型安全なTypeScript用ORM」が必要ではないかと考えるようになりました。

そうして開発を始め、後日実際にライブラリとして公開することになりました。どのようなORMになっているか、[Active Recordパターンを採用したTypeScript用ORM「Accel Record」の紹介](https://qiita.com/koyopro/items/917c2c98db3de7518849)や、[README(日本語)](https://github.com/koyopro/accella/blob/main/packages/accel-record/README-ja.md)で是非チェックしてみてください。

----

(この記事は『[Seeking a Type-Safe Ruby on Rails in TypeScript, I Started Developing an ORM](https://dev.to/koyopro/seeking-a-type-safe-ruby-on-rails-in-typescript-i-started-developing-an-orm-1of5)』の原文です)