You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 07:10:06