【发布时间】:2021-02-19 21:50:19
【问题描述】:
我花了几天时间将我的 GraphQL 服务器重写为 Typescript,但最终,我陷入了定义 Schema Directives 的困境。已经花了很多时间在谷歌上搜索,但没有找到使用 Typescript 的“更高级”的 Apollo GraphQL 示例。
当我使用纯 Javascript 时,它非常适合我,没有任何问题,我的指令看起来像这样:
// TS but no difference from JS in terms of extended class or method overriden
export default class UserAuthDirective extends SchemaDirectiveVisitor {
visitFieldDefinition(field: any, details: any) {
field._requiredRole = this.args.role
const { resolve = defaultFieldResolver } = field
field.resolve = function (...args: any) {
// LOGIC CHECKING ROLES
}
}
}
我使用 graphql-tools 库中的 makeExecutableSchema,如下所示:
// Again basically identical with original JS
const schema = makeExecutableSchema({
typeDefs: mergeTypes(types, { all: true }),
resolvers: loadResolvers(),
logger: {
log: (e) => logger.error(e.message, e),
},
allowUndefinedInResolve: false,
inheritResolversFromInterfaces: true,
resolverValidationOptions: {
allowResolversNotInSchema: false,
requireResolversForResolveType: true,
},
schemaDirectives: {
userHas: UserAuthDirective,
// ^^^ Here I'm getting. "Type 'typeof UserAuthDirective' is not assignable to type 'typeof SchemaDirectiveVisitor'. Types of property 'visitSchemaDirectives' are incompatible."
},
})
SchemaDirectiveVisitor 的构造函数受到保护,因此我无法从那里实例化该类。 我不是真正的高级 Typescript 用户,所以也许我只是完全错误地理解它或遗漏了一些基本概念,但我真的坚持这一点,并且很高兴有任何提示或猜测我可能做错了什么。
谢谢:-)
【问题讨论】:
-
您是从
graphql-tools或apollo-server导入SchemaDirectiveVisitor吗? -
伙计,你为我节省了很多拉头发 :-D 非常感谢!当然,我使用的是
apollo-server而不是graphql-tools。
标签: javascript typescript apollo-server graphql-js