声纳给出“预期分配或函数调用”消息
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 中的代码有效。你的解释完全改变了它的语义。以上是关于声纳给出“预期分配或函数调用”消息的主要内容,如果未能解决你的问题,请参考以下文章