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.Session
Session
类型包括 session
和 user
属性。user
属性代表用户对象类型,session
属性代表 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"
}
}
})],
});