PayloadCMS v2迁移至v3:如何获取用户集合的TData类型?
解决PayloadCMS v3中Access函数获取用户集合TData类型的问题
方法1:显式定义并导出用户类型
在用户集合配置文件中直接定义用户类型,同时关联集合字段,确保类型与实际字段匹配:
// collections/Users.ts import { CollectionConfig } from 'payload/types'; // 显式定义用户类型 export type User = { id: string; roles: 'admin' | 'editor' | 'viewer'; // 与集合字段的options对应 email: string; // 其他用户字段... }; export const Users: CollectionConfig = { slug: 'users', fields: [ { name: 'roles', type: 'select', options: ['admin', 'editor', 'viewer'], required: true, }, { name: 'email', type: 'email', required: true, }, // 其他字段... ], };
之后在Access函数中直接导入该类型使用:
import { Access } from 'payload/config'; import type { User } from './collections/Users'; const adminOnlyAccess: Access<any, User> = ({ req }) => { // req.user现在会正确识别roles属性 return req.user?.roles.includes('admin') ?? false; };
方法2:从集合配置自动推导用户类型
利用Payload内置的类型工具,从用户集合配置中自动推导文档类型:
import { PayloadCollection } from 'payload/types'; import { Users } from './collections/Users'; // 从集合配置推导用户文档类型 type User = PayloadCollection<typeof Users>['docs'][0]; // 应用到Access函数 const editorAccess: Access<any, User> = ({ req }) => { return req.user?.roles.includes('editor') ?? false; };
方法3:从全局Payload配置提取用户类型
如果已在全局配置中注册用户集合,可以从配置类型中筛选出用户集合的类型:
import { Access } from 'payload/config'; import type { Config } from './payload.config'; // 从全局配置中提取用户集合的文档类型 type User = Extract<Config['collections'][number], { slug: 'users' }>['fields'] extends infer Fields ? { [K in Fields[number]['name']]: any } : never; const restrictedAccess: Access<any, User> = ({ req }) => { return ['admin', 'editor'].includes(req.user?.roles) ?? false; };
关键提示
Payload v3的Access泛型仍支持第二个参数指定用户类型,只是迁移文档未明确说明类型获取方式。显式定义用户类型是最稳定的方案,尤其是字段结构复杂时,能避免自动推导可能出现的类型歧义。
内容的提问来源于stack exchange,提问作者Drake
相关产品推荐
相关产品推荐

