我目前正在开发一个 KeystoneJS 项目,并遇到了 TypeScript 的问题。我已经定义了一个访问控制函数 isAdmin,如 KeystoneJS documentation:
中所建议的那样const isAdmin = ({ session }: { session: Session }) => session?.data.isAdmin;
但是,当我在 schema.ts 中的列表操作(创建、删除)的访问配置中使用此函数时,TypeScript 会抛出以下错误:
Type '() => boolean' is not assignable to type 'ListOperationAccessControl<"create" | "delete", TypeInfo<any>>'.
Types of parameters '__0' and 'args' are incompatible.
Type 'BaseAccessArgs<TypeInfo<any>> & { operation: "create"; }' is not assignable to type '{ session: Session; }'.
Property 'session' is optional in type 'BaseAccessArgs<TypeInfo<any>> & { operation: "create"; }' but required in type '{ session: Session; }'.
这是我的 schema.ts 的简化版本:
import { list } from "@keystone-6/core";
import type { Lists } from ".keystone/types";
type Session = {
data: {
id: string;
isAdmin: boolean;
};
};
const isAdmin = ({ session }: { session: Session }) => session?.data.isAdmin;
export const lists: Lists = {
User: list({
access: {
operation: {
create: isAdmin,
delete: isAdmin,
},
// ... other access controls
},
fields: {
// ... other fields
},
}),
// ... other lists
};
此外,我发现有趣的是,node_modules/@keystone-6/core/src/access.ts 中的内置allowAll 函数仅返回true,工作时没有任何问题。
export function allowAll() {
return true;
}
但是当我尝试对 isAdmin 执行同样的操作时,仍然不起作用。
function isAdmin() {
return true;
}
我尝试使用有效的内置函数(allowAll)作为具有相同逻辑的本地函数(isAdmin)进行调试,但它仍然不起作用。
当我运行
npm run dev
时它仍然有效,但是当我运行 npm run test
时它不会。
npm run test 只是运行 jest。
您有两个不同的案例:
第一
const isAdmin = ({ session }: { session: Session }) => session?.data.isAdmin;
因为会话变量可以是“未定义”类型,所以你不能返回“未定义”,所以你需要放置一些东西来强制返回布尔值,例如:
const isAdmin = ({ session }: { session: Session }) => Boolean(session?.data.isAdmin);
第二个
function isAdmin() { return true; }
您可以将该函数作为一般函数放在 access 中,但在特定操作中,您必须定义每个操作创建、查询等参数的类型
问候!