The library comes with support for a full typesafe API.

Typing data values

The useDatabaseSnapshot returns a DataSnapshot returns an instance whose val() method retuns the data as any. In this case, you'll need to cast it.

However, the useDatabaseValue hook instead returns the raw data of the reference node, allowing us to provide the data type to the hook:

type Product = {
  name: string;
  price: number;

const product = useDatabaseValue<Product>(["products", id], database, dbRef);

if (product.isSuccess) {
  // product.data is now typed!

Typing mutations

The mutation hooks allow us to provide a type which ensures the mutation calls are type safe.

When setting data:

const mutation = useDatabaseSetMutation<number>(dbRef);

When updating data, the type must extend the expected update values (Record<string, unknown>):

type Updates = {
  age: number;
  "address/line1": string;

const mutation = useDatabaseUpdateMutation<Updates>(dbRef);

  age: 18,
  "address/line1": "Mountain View",

When working with Transactions, you can type the expected value provided to the transaction function:

type Post = {
  title: string;
  likes: number;

const mutation = useDatabaseTransaction<Post>(dbRef, (post: Post | null) => {
  // ...