🐬
Firebase × TypeScript の最適解?FirestoreTyped のご紹介
はじめに
Firebase Firestore は柔軟で便利な NoSQL データベースですが、型安全性という点では課題があります。
TypeScript で型を定義していても、Firestore にはそれを保証する仕組みがなく、型と実際のデータがずれるという問題がよく発生します。
// Firestore の素の利用例
await db.collection("users").doc("123").set({
name: 123, // ❌ string 型のはずが number
email: null // ❌ 必須フィールドが欠けている
})
// → TypeScript は気づかない、実行時に初めて問題になる
この問題を解決するために、Firestore を型安全かつランタイムでもバリデーション可能にするラッパーライブラリ 👉 @info-lounge/firestotyped
を公開しました!
FirestoreTyped とは?
FirestoreTyped は、Firestore を 型安全かつバリデーション必須で扱うための TypeScript ライブラリです。
特徴は以下の通りです:
- ✅ 型安全:TypeScript の型とランタイム検証の両方で安全性を確保
- ✅ バリデーション必須:すべての読み書きに validator を要求
- ✅ Zod でも Typia でも利用可能(開発スタイルに合わせて選べる)
- ✅ ネイティブ API 準拠:Firestore の素の使い方に近い操作感
Quick Example
// ✅ FirestoreTyped の利用例
import { getFirestoreTyped } from "@info-lounge/firestore-typed"
import typia from "typia"
interface User {
name: string
email: string
}
// typia のバリデーション関数を作成
const userValidator = typia.createAssert<User>()
const db = getFirestoreTyped()
const users = db.collection<User>("users", userValidator)
// データ書き込み(自動バリデーション)
await users.doc("123").set({
name: "Alice",
email: "alice@example.com"
})
// データ取得(オプションで read 時もバリデーション)
const snapshot = await users.doc("123").get()
const user = snapshot.data
もし User
型に合わないデータを読み書きすると、必ずバリデーションエラーになります。
🔄 Zod もサポートしています
typia だけでなく、Zod でのバリデーションも可能です。
すでに Zod を使っているプロジェクトにも導入しやすいようにしています。
import { z } from "zod"
const UserSchema = z.object({
name: z.string(),
email: z.string().email(),
})
type User = z.infer<typeof UserSchema>
const userValidator = (data: unknown): User => UserSchema.parse(data)
const db = getFirestoreTyped()
const users = db.collection<User>("users", userValidator)
await users.doc("123").set({
name: "Bob",
email: "bob@example.com"
})
FirestoreTyped を使うメリット
-
安心感
→ すべての CRUD 操作がバリデーションを通るため、「型がズレたまま本番にデータが入る」事故を防げます。 -
柔軟性
→ Zod でも Typia でも、あるいは独自 validator でも使える「validation-agnostic」設計です。 -
開発体験
→ Firestore のネイティブ API と似た操作感なので、学習コストが低くスムーズに導入できます。
インストール方法
npm install @info-lounge/firestore-typed
npm install typia # または zod
typia を使う場合は ts-patch
による transformer 設定が必要です。
詳しくは GitHub の README をご覧ください。
まとめ
- Firestore は便利だけど型安全性が弱い
- FirestoreTyped で 型安全 + ランタイムバリデーション を両立
- Zod でも Typia でも使えるので、プロジェクトに合わせて選べる
- 公式ドキュメントや導入方法はこちら 👉 GitHub
ぜひ試していただき、フィードバックやスターをいただけると嬉しいです 🚀
Discussion