分享方式:


Linter 規則:使用安全存取運算子

此規則會尋找使用 contains() 函式在存取之前檢查屬性是否存在,並提供更簡單的自動取代。 其可用於建議並向使用者介紹簡化的對等語法,而無須引入任何功能程式碼變更。 如需詳細資訊,請參閱 Safe dereference 運算子 (部分機器翻譯)。

其所尋找的特定模式如下:

  • 用於檢查屬性存取的三元運算子:

    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