TypeScript

Better Auth 设计为类型安全的。客户端和服务器端都使用 TypeScript 构建,让你可以轻松推断类型。

TypeScript 配置

严格模式

Better Auth 设计为与 TypeScript 的严格模式一起工作。我们建议在你的 TypeScript 配置文件中启用严格模式:

tsconfig.json
{
  "compilerOptions": {
    "strict": true
  }
}

如果你不能将 strict 设置为 true,你可以启用 strictNullChecks

tsconfig.json
{
  "compilerOptions": {
    "strictNullChecks": true,
  }
}

类型推断

客户端 SDK 和服务器端都提供了可以通过 $Infer 属性推断的类型。插件可以扩展基础类型,如 UserSession,你可以使用 $Infer 来推断这些类型。此外,插件还可以提供额外的类型,这些类型也可以通过 $Infer 进行推断。

auth-client.ts
import { createAuthClient } from "better-auth/client"
 
const authClient = createAuthClient()
 
export type Session = typeof authClient.$Infer.Session

Session 类型包含 sessionuser 属性。user 属性表示用户对象类型,session 属性表示会话对象类型。

你也可以在服务器端推断类型。

auth.ts
import { betterAuth } from "better-auth"
import Database from "better-sqlite3"
 
export const auth = betterAuth({
    database: new Database("database.db")
})
 
type Session = typeof auth.$Infer.Session

额外字段

Better Auth 允许你向用户和会话对象添加额外字段。所有额外字段都会被正确推断,并在服务器端和客户端可用。

import { betterAuth } from "better-auth"
import Database from "better-sqlite3"
 
export const auth = betterAuth({
    database: new Database("database.db"),
    user: {
       additionalFields: {
          role: {
              type: "string"
            } 
        }
    }
   
})
 
type Session = typeof auth.$Infer.Session

在上面的例子中,我们向用户对象添加了一个 role 字段。这个字段现在在 Session 类型中可用。

在客户端推断额外字段

为了确保在客户端正确推断额外字段的类型,你需要告知客户端这些字段。根据你的项目结构,有两种方法可以实现这一点:

  1. 对于 Monorepo 或单项目设置

如果你的服务器和客户端代码位于同一个项目中,你可以使用 inferAdditionalFields 插件来自动从服务器配置推断额外字段。

import { inferAdditionalFields } from "better-auth/client/plugins";
import { createAuthClient } from "better-auth/react";
import type { auth } from "./auth";
 
export const authClient = createAuthClient({
  plugins: [inferAdditionalFields<typeof auth>()],
});
  1. 对于分离的客户端-服务器项目

如果你的客户端和服务器位于不同的项目中,你需要在创建 auth 客户端时手动指定额外字段。

import type { auth } from "./auth";
import { inferAdditionalFields } from "better-auth/client/plugins";
 
export const authClient = createAuthClient({
  plugins: [inferAdditionalFields({
      user: {
        role: {
          type: "string"
        }
      }
  })],
});

On this page