为什么 Prettier 在解构赋值之前声明了 `;`?

问题描述

我的 Angular 组件中有 if 块:

if (desc.length > 0) {
    [this.errorMsg] = desc
}

但是,Prettier 不喜欢它并建议将 ; 放在解构赋值的开头:

if (desc.length > 0) {
    ;[this.errorMsg] = desc
}

我只想知道为什么?我的 ESLintPrettier 配置中是否存在错误?还是有什么原因?

添加
.eslintrc.json:

{
  "overrides": [
    {
      "files": ["*.ts"],"parserOptions": {
        "project": [
          "tsconfig.*?.json","e2e/tsconfig.e2e.json"
        ],"createDefaultProgram": true
      },"extends": [
        "plugin:@angular-eslint/recommended",// AirBnB guide style
        "airbnb-typescript/base",// Prettier settings
        "prettier","plugin:prettier/recommended"
      ],"rules": {
        /**
         * Any TypeScript source code (NOT TEMPLATE) related rules you wish to use/reconfigure over and above the
         * recommended set provided by the @angular-eslint project would go here.
         */
        "@angular-eslint/directive-selector": [
          "error",{ "type": "attribute","prefix": "app","style": "camelCase" }
        ],"@angular-eslint/component-selector": [
          "error",{ "type": "element","style": "kebab-case" }
        ]
      }
    },// NOTE: WE ARE NOT APPLYING PRETTIER IN THIS OVERRIDE,ONLY @ANGULAR-ESLINT/TEMPLATE
    {
      "files": ["*.html"],"extends": ["plugin:@angular-eslint/template/recommended"],"rules": {}
    },// NOTE: WE ARE NOT APPLYING @ANGULAR-ESLINT/TEMPLATE IN THIS OVERRIDE,ONLY PRETTIER
    {
      "files": ["*.html"],"excludedFiles": ["*inline-template-*.component.html"],"extends": ["plugin:prettier/recommended"],"rules": {
        // NOTE: WE ARE OVERRIDING THE DEFAULT CONFIG TO ALWAYS SET THE PARSER TO ANGULAR (SEE BELOW)
        "prettier/prettier": ["error",{ "parser": "angular" }]
      }
    }
  ]
}

.prettierrc.json:

{
  "singleQuote": true,"tabWidth": 2,"printWidth": 120,"semi": false
}

解决方法

已经有了关于这个主题的 bunch of discussion,如果您有兴趣阅读原因

即使不是严格要求,在开头添加分号也更漂亮,因为这样可以更轻松地在文件中移动代码行,而不会意外引入 ASI 问题。 - azz

编辑: Prettier 也解释了为什么 here

但基本上是因为

someCall()
[a] = obj

不一样

someCall();
[a] = obj

但是既然你要求 prettier 去掉分号,那就把它放在开头

someCall()
;[a] = obj

您还可以阅读 standardjs rules about the subject

// ✓ ok
;[1,2,3].forEach(bar)

// ✗ avoid
[1,3].forEach(bar)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...