KeystoneJS文档定义的isAdmin访问控制函数TypeScript报错求助
KeystoneJS TypeScript访问控制函数类型不兼容问题解决方案
问题根源
错误核心在于:Keystone的BaseAccessArgs类型中,session是可选属性(未登录请求时会是undefined),但你定义的isAdmin函数把session声明为必填参数,导致类型完全不匹配,触发TypeScript报错。
修复方案
1. 修正isAdmin的参数类型
把session改为可选类型,同时建议直接使用Keystone自动生成的Session类型(避免自定义类型和框架内部类型不一致):
import type { Session } from '.keystone/types'; // 让session参数变为可选,同时用空值合并运算符确保返回布尔值 const isAdmin = ({ session }: { session?: Session }) => session?.data.isAdmin ?? false;
如果想要更严谨的类型约束,可以直接对齐Keystone的访问控制函数类型:
import type { ListOperationAccessControl } from '@keystone-6/core'; import type { TypeInfo, Session } from '.keystone/types'; const isAdmin: ListOperationAccessControl<'create' | 'delete', TypeInfo> = ({ session }) => { return session?.data.isAdmin ?? false; };
2. 为什么内置allowAll能正常工作?
内置allowAll没有显式声明参数,TypeScript会自动推断它可以接收任意参数(包括带有可选session的参数),所以不会触发类型错误。而你自己写的无参isAdmin如果显式声明了(),TypeScript会判定它不接受任何参数,和Keystone要求的函数类型冲突。
3. 解决测试环境报错
修正类型后,npm run test就能通过类型检查了——现在函数类型完全符合Keystone的访问控制要求。
完整修正后的schema.ts示例
import { list } from "@keystone-6/core"; import type { Lists, Session } from ".keystone/types"; const isAdmin = ({ session }: { session?: Session }) => session?.data.isAdmin ?? false; export const lists: Lists = { User: list({ access: { operation: { create: isAdmin, delete: isAdmin, }, // ... 其他访问控制配置 }, fields: { // ... 其他字段配置 }, }), // ... 其他列表 };
内容的提问来源于stack exchange,提问作者lgf2111
相关产品推荐
相关产品推荐

