You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用astq查询Acorn AST中TemplateElement的raw/cooked属性?

问题:如何用ASTQ查询TemplateElement的value.raw/cooked属性

目标代码:

const t = 'template';
const s = `I'm a ${t}`;

Acorn解析后模板字面量的AST结构:

{
    "type": "TemplateLiteral",
    "start": 32,
    "end": 53,
    "expressions": [
      {
        "type": "Identifier",
        "start": 50,
        "end": 51,
        "name": "t"
      }
    ],
    "quasis": [
      {
        "type": "TemplateElement",
        "start": 33,
        "end": 48,
        "value": {
          "raw": "I'm a ",
          "cooked": "I'm a "
        },
        "tail": false
      },
      {
        "type": "TemplateElement",
        "start": 52,
        "end": 52,
        "value": {
          "raw": "",
          "cooked": ""
        },
        "tail": true
      }
    ]
}

需求:通过TemplateElement的value.raw或value.cooked属性进行查询,但嵌套的value节点没有type属性,不知如何定位。


解决方案

ASTQ支持直接访问对象属性,无需依赖type字段,你可以通过链式属性访问定位到value.raw或value.cooked。以下是几种常见查询场景:

1. 查询所有非空raw值的TemplateElement

// 匹配所有raw值不为空的TemplateElement节点
.TemplateLiteral > .quasis[] > .TemplateElement[value.raw != '']

2. 精准匹配指定raw值的节点

// 匹配raw值为"I'm a "的TemplateElement节点
.TemplateLiteral > .quasis[] > .TemplateElement[value.raw = "I'm a "]

3. 基于cooked属性的模糊查询

如果需要针对cooked属性筛选,语法逻辑一致:

// 匹配cooked值包含"a "的节点
.TemplateLiteral > .quasis[] > .TemplateElement[value.cooked like "%a "]

语法说明

  • .TemplateLiteral:定位到模板字面量根节点
  • > .quasis[]:遍历节点的quasis数组子项
  • > .TemplateElement:筛选出类型为TemplateElement的子节点
  • [value.raw = "xxx"]:通过方括号条件直接访问嵌套属性,设置匹配规则

内容的提问来源于stack exchange,提问作者Verbal_Kint

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 13:36:03