TypeScript

Better Auth 旨在实现类型安全。客户端和服务器端均使用 TypeScript 构建,让您可以轻松推断类型。

TypeScript 配置

严格模式

Better Auth 旨在与 TypeScript 的严格模式兼容。我们建议在您的 TypeScript 配置文件中启用严格模式:

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

如果您无法将 strict 设置为 true,则可以启用 strictNullChecks

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

如果您在使用 TypeScript 时遇到类型推断超过编译器序列化最大长度的错误, 则请确保您遵循了上述说明,同时确保未启用 declarationcomposite

类型推断

客户端 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",
              input: false
            } 
        }
    }
   
})

type Session = typeof auth.$Infer.Session

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

input 属性

附加字段配置中的 input 属性决定了该字段是否应包含在用户输入中。此属性默认为 true,意味着该字段将在注册等操作期间作为用户输入的一部分。

要防止字段成为用户输入的一部分,您必须显式设置 input: false

additionalFields: {
    role: {
        type: "string",
        input: false
    }
}

input 设置为 false 时,该字段将从用户输入中排除,防止用户为其传递值。

默认情况下,附加字段会包含在用户输入中,如果未小心处理,这可能导致安全漏洞。对于不应由用户设置的字段(如 role),在配置中设置 input: false 至关重要。

在客户端推断附加字段

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

  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. 用于独立的客户端-服务器项目

如果您的客户端和服务器位于单独的项目中,您需要在创建认证客户端时手动指定附加字段。

import { inferAdditionalFields } from "better-auth/client/plugins";

export const authClient = createAuthClient({
  plugins: [inferAdditionalFields({
      user: {
        role: {
          type: "string"
        }
      }
  })],
});

On this page