0

我正在重建程序的 AST,我拥有的条件之一是在索引 N 处获取给定数组的元素。为了了解我应该如何构建它,我像往常一样去了AST Explorer并查看了该语句是如何构建的:

arr[0];

输出是:

{
        "type": "MemberExpression",
        "start": 0,
        "end": 4,
        "object": {
          "type": "Identifier",
          "start": 0,
          "end": 1,
          "name": "a"
        },
        "property": {
          "type": "Literal",
          "start": 2,
          "end": 3,
          "value": 0,
          "raw": "0"
        },
        "computed": true,
        "optional": false
      }

由于在 Babel 中我们使用数字文字,numericLiteral我尝试了这个:

memberExpression(identifier(<myArrayNameAsAString>), numericLiteral(0))

这令人惊讶地抛出了错误:

Error: Property property of MemberExpression expected node to be of a type ["Identifier","PrivateName"] but instead got "NumericLiteral"

现在我开始想知道 Babel 一开始是如何构建这样一个 AST 的。所以我给了这个表达式:

arr[0]

并得到了这个输出(来自 Babel):

MemberExpression: {
  {
    ...,
    type: 'Identifier',
    name: 'arr'
  },
  {
    ...,
    type: 'NumericLiteral',
    value: 0
  }
}

看起来 Babel 能够准确地构建我想要构建的东西,但是当我这样做时它会抛出一个错误。

作为替代方案,我研究了其他方法来实现这一点,例如使用.at。但是,该操作尚未被广泛采用,我想避免它。

4

1 回答 1

0

在调试更深的 Babel 之后,要求该属性computed为真。它有一个内部验证器,如下所示:

const normal = (0, _utils.assertNodeType)("Identifier", "PrivateName");
const computed = (0, _utils.assertNodeType)("Expression");

computed在未设置属性的情况下,唯一允许的 2 个选项是IdentifierPrivateName

于 2022-02-11T13:56:22.807 回答