在解析器中,我需要检测参数的类型。我可以有一个由多个输入类型组成的深层嵌套参数对象。像这样:
# where is of type DocumentWhereInput
# and nested objects in OR operator are DocumentWhereInput types too
documents(where: {OR: [{id_gt: 0}, {id_not: 1}]}, first: 2) {
id
}
}
我尝试使用TypeInfo:
const typeInfo = new TypeInfo(info.schema);
const filteredSelections = visit(info.operation, {
leave: (node, key, parent, path, ancestors) => typeInfo.leave(node),
enter: (node, key, parent, path, ancestors) => {
typeInfo.enter(node);
const type = typeInfo.getInputType();
}});
但这是
我可以使用graphiql
中的函数来获取变量类型,如下所示:
export function collectVariables(schema, operationDefinition) {
const variableToType = Object.create(null);
const variableDefinitions = operationDefinition.variableDefinitions;
if (variableDefinitions) {
variableDefinitions.forEach(({variable, type}) => {
const inputType = typeFromAST(schema, type);
if (inputType) {
variableToType[variable.name.value] = inputType;
}
});
}
return variableToType;
}
collectVariables(info.schema, info.operation)
但这仅提供变量的类型,而不是子类型。
所以
Resolver函数将args接受为带有内联参数和变量的扩展对象。如何检测此args组成的类型?还是整个操作,但包括变量?这是可能的,graphql在验证中内部执行,graphiql也执行,但是我不知道怎么做。
例如在开始时查询,我想要这样的东西:
{ where: DocumentWhereInput { OR: [ DocumentWhereInput, DocumentWhereInput ] }, first: Int }
或任何其他将类型映射到值的结构