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

如何通过ESLint强制TypeScript多行赋值的特定换行缩进风格?

需求:强制特定TypeScript缩进风格

我需要在TypeScript项目中强制以下缩进格式:

const response: Asana.Response<Asana.Tag[]> =
        await tagsApi.getTagsForWorkspace(process.env.ASANA_WORKSPACE_GID!, opts);

禁止以下任意写法:

  • 续行与上一行缩进一致
const response: Asana.Response<Asana.Tag[]> = 
    await tagsApi.getTagsForWorkspace(process.env.ASANA_WORKSPACE_GID!, opts);
  • 续行过度缩进至运算符对齐
const response: Asana.Response<Asana.Tag[]> = 
                  await tagsApi.getTagsForWorkspace(process.env.ASANA_WORKSPACE_GID!, opts);
  • 续行无额外缩进
const response: Asana.Response<Asana.Tag[]> = 
await tagsApi.getTagsForWorkspace(process.env.ASANA_WORKSPACE_GID!, opts);

我试过indent、@stylistics/indent、@stylistics/operator-linebreak这几个ESLint规则,但都没法实现“运算符=留在首行末尾,表达式下一行缩进续写”的要求。查了ESLint Issue #12248,知道这是个已知功能缺口,但想找可行的变通方案。

当前使用的工具版本:

"@eslint/js": "^9.15.0",
"@stylistic/eslint-plugin": "^2.11.0",
"eslint": "^9.15.0",
"typescript-eslint": "^8.16.0"

可行的解决办法

因为原生ESLint规则确实不支持这种精准的组合要求,目前有两种靠谱的思路:

1. 组合现有规则 + 自定义小规则

第一步:用operator-linebreak强制运算符在行尾

先确保=必须留在首行末尾,不能换行后写:

{
  "@stylistic/operator-linebreak": ["error", "after", {
    "overrides": {
      "=": "endOfLine"
    }
  }]
}

这个配置能搞定运算符的位置,但还管不了续行的缩进。

第二步:自定义规则校验续行缩进

写个极简的自定义ESLint规则,专门检查赋值表达式的续行缩进:

// 可放在项目的.eslintrc.js里,或者单独的rules/assignment-indent.js文件
module.exports = {
  rules: {
    "custom/assignment-continuation-indent": {
      create(context) {
        return {
          AssignmentExpression(node) {
            // 仅当赋值左右两边不在同一行时检查
            if (node.right.loc.start.line !== node.left.loc.end.line) {
              // 预期缩进:左边的缩进 + 额外指定的空格数(默认4)
              const baseIndent = context.getSourceCode().getIndent(node.left);
              const expectedIndent = baseIndent + (context.options[0] || 4);
              const actualIndent = context.getSourceCode().getIndent(node.right);

              if (actualIndent !== expectedIndent) {
                context.report({
                  node: node.right,
                  message: `赋值续行需缩进${expectedIndent}个空格,当前为${actualIndent}个`
                });
              }
            }
          }
        };
      }
    }
  }
};

然后在ESLint配置里启用这个规则:

{
  "rules": {
    "custom/assignment-continuation-indent": ["error", 4]
  }
}

2. 用Prettier配合ESLint(更省心)

如果项目能引入Prettier,这是最省事的方案,直接通过Prettier配置实现风格强制,再用ESLint做校验:

Prettier配置(.prettierrc)

{
  "printWidth": 80,
  "tabWidth": 4,
  "useTabs": false,
  "operatorPosition": "endOfLine",
  "indentContinuationLines": 4
}

然后安装依赖:

npm install eslint-plugin-prettier eslint-config-prettier --save-dev

最后在ESLint配置里集成:

{
  "extends": ["plugin:prettier/recommended"],
  "plugins": ["prettier"],
  "rules": {
    "prettier/prettier": "error"
  }
}

Prettier会自动帮你把赋值续行的表达式缩进指定的空格数,同时强制=留在首行末尾,完全匹配你的需求。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 21:13:14