🐬

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 を公開しました!
https://www.npmjs.com/package/@info-lounge/firestore-typed


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