如何通过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
相关产品推荐
相关产品推荐

