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 属性代表 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