eslint 在单行 if 括号后强制空格

Mu-*_*sai 5 eslint eslintrc typescript-eslint

我对 ESLint 还很陌生,我找不到满足我要求的规则。考虑以下代码:

if(someCondition)i++;
Run Code Online (Sandbox Code Playgroud)

我想在括号后强制使用一个空格,这样我们就应该有以下内容:

if(someCondition) i++;
Run Code Online (Sandbox Code Playgroud)

但我就是找不到这样的规则;它不是space-before-function-paren(显然),keyword-spacing(只影响 后面的间距if)或space-before-blocks(因为这是单行 if,所以没有块)。请帮忙。谢谢!

PS 同样的规则也应该适用于单行 while。

Mu-*_*sai 0

由于 ESLint 没有这样的规则,并且政策说他们将不再考虑此类提案,所以我最终编写了自己的规则,如下所示:

module.exports = {
    "single-line-control-statement-spacing": {
        meta: {
            type: "layout",
            docs: {
                description: "Enforces consistent spacing in single-line control statements.",
            },
            fixable: "whitespace",
        },
        create(context) {
            const sourceCode = context.getSourceCode();

            function checkSpaceAfter(node) {
                if(!node) return;
                if(node.loc.start.line !== node.loc.end.line) return; // Not single-line
                const body = node.consequent || node.body;
                const token = sourceCode.getFirstToken(body);
                const prev = sourceCode.getTokenBefore(token);
                const start = prev.range[1];
                const end = token.range[0];
                if(start === end) {
                    context.report({
                        loc: {
                            start: sourceCode.getLocFromIndex(start),
                            end: sourceCode.getLocFromIndex(end),
                        },
                        message: "There should be a single space after control statements.",
                        fix(fixer) {
                            return fixer.replaceTextRange([start, end], " ");
                        },
                    });
                }
            }

            return {
                IfStatement: checkSpaceAfter,
                DoWhileStatement: checkSpaceAfter,
                ForInStatement: checkSpaceAfter,
                ForOfStatement: checkSpaceAfter,
                ForStatement: checkSpaceAfter,
                WhileStatement: checkSpaceAfter,
            };
        },
    },
};
Run Code Online (Sandbox Code Playgroud)

然后,我使用eslint-plugin-local-rules在我的项目中启用此规则。