TypeScript
Better Auth 旨在实现类型安全。客户端和服务器端均使用 TypeScript 构建,让您可以轻松推断类型。
TypeScript 配置
严格模式
Better Auth 旨在与 TypeScript 的严格模式兼容。我们建议在您的 TypeScript 配置文件中启用严格模式:
{
"compilerOptions": {
"strict": true
}
}如果您无法将 strict 设置为 true,则可以启用 strictNullChecks:
{
"compilerOptions": {
"strictNullChecks": true,
}
}如果您在使用 TypeScript 时遇到类型推断超过编译器序列化最大长度的错误,
则请确保您遵循了上述说明,同时确保未启用 declaration 和 composite。
类型推断
客户端 SDK 和服务器端均提供可以使用 $Infer 属性推断的类型。插件可以扩展基础类型,如 User 和 Session,您可以使用 $Infer 来推断这些类型。此外,插件还可以提供可以通过 $Infer 推断的额外类型。
import { createAuthClient } from "better-auth/client"
const authClient = createAuthClient()
export type Session = typeof authClient.$Infer.SessionSession 类型包含 session 和 user 属性。user 属性表示用户对象类型,而 session 属性表示会话对象类型。
您也可以在服务器端推断类型。
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 至关重要。
在客户端推断附加字段
为了确保客户端对附加字段的正确类型推断,您需要告知客户端这些字段。根据您的项目结构,有两种方法可以实现这一点:
- 用于 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>()],
});- 用于独立的客户端-服务器项目
如果您的客户端和服务器位于单独的项目中,您需要在创建认证客户端时手动指定附加字段。
import { inferAdditionalFields } from "better-auth/client/plugins";
export const authClient = createAuthClient({
plugins: [inferAdditionalFields({
user: {
role: {
type: "string"
}
}
})],
});