声纳给出“预期分配或函数调用”消息

Posted

技术标签:

【中文标题】声纳给出“预期分配或函数调用”消息【英文标题】:Sonar gives 'Expected an assignment or function call' message 【发布时间】:2020-12-31 23:52:37 【问题描述】:

我在 NgRx 工作并收到此错误:

'期待一个赋值或函数调用,却看到了一个表达式。'

this.sfForm.get('code')?.[this._mode ? 'disable' : 'enable'](); 中的声纳问题。

我不明白来自声纳的信息,以及这里要解决的问题。 我需要一些帮助来理解代码并解决问题。

<mat-form-field [formGroup]="sfForm">
  <input Input
         matInput
         (keydown.enter)="search($event.target.value)"
         [type]="''"
         formControlName="code"
         required>
</mat-form-field>
sfForm: FormGroup;
private _mode: boolean = true;
      
public set scanMode(value: boolean) 
  this._mode = value;
  this.sfForm.get('code')?.[this._mode ? 'disable' : 'enable']();

【问题讨论】:

this._mode ? 'disable' : 'enable' - Question mark and colon in javascript; [] - JavaScript property access: dot notation vs. brackets?; ?. - Optional Chaining in JavaScript; What does this symbol mean in JavaScript? this.sfForm.get('code')? 将以 null 安全的方式获取 'code' 的值,然后 [this._mode ? 'disable' : 'enable'] 将从该结果中获取 'disable''enable' 属性,具体取决于 this._mode , 最后获取的任何内容都将作为带有()的函数执行 【参考方案1】:

以下是该行的细分:

this.sfForm.get('code') // get by the key "code"
?.                      // if `undefined` or `null`, stop here (see #1 below)
[                       // else, get prop by expression in [square brackets]
    this._mode ?        // if this._mode is truthy...
        'disable'       // that prop is 'disable'
        : 'enable'      // else, that prop is 'enable'
]                       // (see #2 below)
()                      // call the function identified by that prop (with 0 args)
#1:Explanation of ?. #2:Explanation of condition ? val1 : val2

在更详细的代码中,它可能如下所示:

const code = this.sfForm.get('code')

if (code !== null && typeof code !== 'undefined') 
    let modeFunction

    if (this._mode) 
        modeFunction = code.disable
     else 
        modeFunction = code.enable
    

    modeFunction()

【讨论】:

谢谢.... :) 非常有帮助的完整解释。如果条件 -> 声纳问题解决,我可以输入,但代码不像内联。他们有什么方法可以解决这个声纳问题,而不是更基本的水平? 我假设(基于this question)错误来自eslint?可能 linter 未能将该行识别为函数调用,它肯定是(只要 this.sfForm.get('code') 不返回无效的东西)。如果代码已经按预期工作,请尝试在违规行之前添加// eslint-disable-next-line @typescript-eslint/no-unused-expressions【参考方案2】:

如果您要分配标签,则不能以这种方式进行。当你这样做时

object[field]

和你一样,你不能赋值。

你可以做的是这样的:

this.sfForm.get('code')?.[this._mode] = this.sfForm.get('code')?.[this._mode] ? 'disable' : 'enable'

如果您想将字段放入变量中,或者以更短的方式。

另外,请注意,您不能调用“?”内的函数赋值,但只使用语句。

【讨论】:

OP 中的代码有效。你的解释完全改变了它的语义。

以上是关于声纳给出“预期分配或函数调用”消息的主要内容,如果未能解决你的问题,请参考以下文章

如何在组件外部访问React Context?

使用 axios 从 json url 获取图像

如何使用声纳扫描仪扫描字节码

声纳 更改此条件,使其不总是评估为“真”。假阳性

为某些代码关闭声纳

AWS Lambda 网关 API 给出错误消息