我正在将GraphQL参考实现从javascript移植到C#。我遇到了一些我不了解或不知道该如何推理的东西,因此我不确定移植它的正确方法。有问题的代码如下所示,或者您可以转到此链接以在存储库parseConstArgument function in parse.js中查看代码:
function parseConstArgument(lexer: Lexer<*>): ArgumentNode {
const start = lexer.token;
return {
kind: Kind.ARGUMENT,
name: parseName(lexer),
value: (expectToken(lexer, TokenKind.COLON), parseConstValue(lexer)),
loc: loc(lexer, start),
};
}
所以我不理解的是将行分配给 value 字段。 expectToken 函数返回一个 Token 对象或引发错误。 parseConstValue 函数返回一个 ValueNode 对象。预计会为 value 字段本身分配一个 ValueNode 。
这是做什么的?它是否首先提取 expectToken 以利用可能的错误,如果没有抛出错误,它将丢弃返回的 Token ,然后分配 parseConstValue 的结果>到值字段?这是我的最佳猜测,但我不确定100%,也不知道如何描述此语法以对其进行Google搜索。
另一种令人困惑的字段分配就像这里的parseValueLiteral function in parse.js
return {
kind: Kind.INT,
value: ((token.value: any): string),
loc: loc(lexer, token),
};
我再次感到困惑的是分配给value字段。在这种情况下, value 需要一个字符串,因此我只是假设这种“古怪”的语法只是将 token.value (它是一个字符串)分配给 value 字段。
如果有人可以解释这一点并可能指向这些javascript功能的文档,将不胜感激。我真的很想确保我不会在端口中引入错误,因为我不了解JavaScript语法。
答案 0 :(得分:2)
value: (expectToken(lexer, TokenKind.COLON), parseConstValue(lexer))
似乎总是要在expectToken(lexer, TokenKind.COLON)
之前执行parseConstValue(lexer)
,方法是将两个用逗号,
运算符分隔的函数调用加上括号,以形成一个表达式,在该表达式中,结果值设置将始终通过parseConstValue(lexer)
的返回值来实现。