Linter 规则 - 使用安全访问运算符

此规则在访问之前查找是否使用了用于检查属性存在情况的 contains() 函数,并提供一种更简单的自动替换方法。 它用于向用户推荐和介绍一种简化的等效语法,该语法未引入任何功能代码更改。 有关详细信息,请参阅安全间接引用运算符

它要查找的特定模式包括:

  • 用于检查属性访问的三元运算符:

    contains(<object>, '<property>') ? <object>.<property> : <default-value>
    

    建议使用以下替换项:

    <object>.?<property> ?? <default-value>
    
  • 用于检查变量命名属性访问的三元运算符:

    contains(<object>, <property-name>) ? foo[<property-name>] : <default-value>
    

    建议使用以下替换项:

    <object>[?<property-name>] ?? <default-value>
    

Linter 规则代码

若要自定义规则设置,请在 Bicep 配置文件中使用以下值:

use-safe-access

解决方案

接受编辑器代码操作以自动执行重构。

示例

命名的属性访问

以下示例会触发规则:

param foo object
var test = contains(foo, 'bar') ? foo.bar : 'baz'

接受代码操作会得到以下 Bicep:

param foo object
var test = foo.?bar ?? 'baz'

变量属性访问

以下示例会触发规则:

param foo object
param target string
var test = contains(foo, target) ? foo[target] : 'baz'

接受代码操作会得到以下 Bicep:

param foo object
param target string
var test = foo[?target] ?? 'baz'

非问题

以下示例不会触发规则:

检查的与访问的属性之间存在区别:

param foo object
var test = contains(foo, 'bar') ? foo.baz : 'baz'

检查的与访问的变量属性之间存在区别:

param foo object
param target string
param notTarget string
var test = contains(foo, target) ? bar[notTarget] : 'baz'

后续步骤

有关 Linter 的详细信息,请参阅使用 Bicep Linter