Bicep'te kullanıcı tanımlı veri türleri

Bicep'te kullanıcı tanımlı veri türlerini kullanmayı öğrenin.

Bu özelliği kullanmak için Bicep CLI sürüm 0.12.X veya üzeri gereklidir.

Kullanıcı tanımlı veri türü söz dizimi

Kullanıcı tanımlı veri türlerini tanımlamak için deyimini type kullanabilirsiniz. Ayrıca, özel türleri tanımlamak için bazı yerlerde tür ifadelerini de kullanabilirsiniz.

type <user-defined-data-type-name> = <type-expression>

Dekont

Dekoratöre yalnızca deyimlerde izin verilirparam.@allowed Bir özelliğin veya output deyiminde type önceden tanımlanmış bir değer kümesinden biri olması gerektiğini bildirmek için birleşim türü söz dizimini kullanın. Birleşim türü söz dizimi deyimlerde paramde kullanılabilir.

Geçerli tür ifadeleri şunlardır:

  • Sembolik başvurular, bir ortam türüne (veya gibiintstring) veya bir deyimde type bildirilen kullanıcı tanımlı tür simgesine başvuran tanımlayıcılardır:

    // Bicep data type reference
    type myStringType = string
    
    // user-defined type reference
    type myOtherStringType = myStringType
    
  • Dizeler, tamsayılar ve boole değerleri de dahil olmak üzere ilkel değişmez değerler geçerli tür ifadeleridir. Örneğin:

    // a string type with three allowed values.
    type myStringLiteralType = 'bicep' | 'arm' | 'azure'
    
    // an integer type with one allowed value
    type myIntLiteralType = 10
    
    // an boolean type with one allowed value
    type myBoolLiteralType = true
    
  • Dizi türleri, geçerli herhangi bir tür ifadesine son eklenerek [] bildirilebilir:

    // A string type array
    type myStrStringsType1 = string[]
    // A string type array with three allowed values
    type myStrStringsType2 = ('a' | 'b' | 'c')[]
    
    type myIntArrayOfArraysType = int[][]
    
    // A mixed-type array with four allowed values
    type myMixedTypeArrayType = ('fizz' | 42 | {an: 'object'} | null)[]
    
  • Nesne türleri küme ayraçları arasında sıfır veya daha fazla özellik içerir:

    type storageAccountConfigType = {
      name: string
      sku: string
    }
    

    Bir nesnedeki her özellik anahtar ve değerden oluşur. Anahtar ve değer iki nokta üst üste :ile ayrılır. Anahtar herhangi bir dize olabilir (geçerli bir tanımlayıcı olmayacak değerler tırnak içine alınmalıdır) ve değer herhangi bir tür söz dizimi ifadesi olabilir.

    Özellik değerinden sonra isteğe bağlı bir işaretçisi ? olmadığı sürece özellikler gereklidir. Örneğin, sku aşağıdaki örnekteki özelliği isteğe bağlıdır:

    type storageAccountConfigType = {
      name: string
      sku: string?
    }
    

    Dekoratörler özelliklerde kullanılabilir. * tüm değerlerin bir kısıtlama gerektirmesini sağlamak için kullanılabilir. kullanırken *ek özellikler yine de tanımlanabilir. Bu örnek, adlı idint türünde bir anahtar gerektiren ve nesnedeki diğer tüm girişlerin en az 10 karakter uzunluğunda bir dize değeri olması gereken bir nesne oluşturur.

    type obj = {
      @description('The object ID')
      id: int
    
      @description('Additional properties')
      @minLength(10)
      *: string
    }
    

    Aşağıdaki örnekte, önceden tanımlanmış değerler kümesini listelemek için birleşim türü söz diziminin nasıl kullanılacağı gösterilmektedir:

    type obj = {
      level: 'bronze' | 'silver' | 'gold'
    }
    

    Özyineleme

    Özyineleme noktasına giden yolun en az bir ayağı isteğe bağlı olduğu sürece nesne türleri doğrudan veya dolaylı özyineleme kullanabilir. Örneğin, myObjectType doğrudan özyinelemeli recursiveProp özelliği isteğe bağlı olduğundan aşağıdaki örnekteki tanım geçerlidir:

    type myObjectType = {
      stringProp: string
      recursiveProp: myObjectType?
    }
    

    Ancak , , level2, level3level4veya level5 isteğe bağlı olmadığından level1aşağıdaki tür tanımı geçerli olmaz.

    type invalidRecursiveObjectType = {
      level1: {
        level2: {
          level3: {
            level4: {
              level5: invalidRecursiveObjectType
            }
          }
        }
      }
    }
    
  • Bicep tekli işleçleri tamsayı ve boole değişmez değerleriyle ya da tamsayı veya boole sabit değer türündeki simgelere başvurularla kullanılabilir:

    type negativeIntLiteral = -10
    type negatedIntReference = -negativeIntLiteral
    
    type negatedBoolLiteral = !true
    type negatedBoolReference = !negatedBoolLiteral
    
  • Birleşimler, herhangi bir sayıda değişmez değer türünde ifade içerebilir. Birleşim türleri Bicep'te izin verilen değer kısıtlamasına çevrilir, bu nedenle üye olarak yalnızca değişmez değerlere izin verilir.

    type oneOfSeveralObjects = {foo: 'bar'} | {fizz: 'buzz'} | {snap: 'crackle'}
    type mixedTypeArray = ('fizz' | 42 | {an: 'object'} | null)[]
    

Deyiminde type kullanılmaya ek olarak, tür ifadeleri de kullanıcı tanımlı veri türleri oluşturmak için şu yerlerde kullanılabilir:

  • Bir param deyiminin type yan tümcesi olarak. Örneğin:

    param storageAccountConfig {
      name: string
      sku: string
    }
    
  • : bir nesne türü özelliğinde öğesini takip eder. Örneğin:

    param storageAccountConfig {
     name: string
      properties: {
        sku: string
      }
    } = {
      name: 'store$(uniqueString(resourceGroup().id)))'
      properties: {
        sku: 'Standard_LRS'
      }
    }
    
  • bir dizi türü ifadesinde öğesinin [] önüne. Örneğin:

    param mixedTypeArray ('fizz' | 42 | {an: 'object'} | null)[]
    

Depolama hesabı oluşturmak için tipik bir Bicep dosyası şöyle görünür:

param location string = resourceGroup().location
param storageAccountName string

@allowed([
  'Standard_LRS'
  'Standard_GRS'
])
param storageAccountSKU string = 'Standard_LRS'

resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = {
  name: storageAccountName
  location: location
  sku: {
    name: storageAccountSKU
  }
  kind: 'StorageV2'
}

Kullanıcı tanımlı veri türlerini kullanarak aşağıdaki gibi görünebilir:

param location string = resourceGroup().location

type storageAccountSkuType = 'Standard_LRS' | 'Standard_GRS'

type storageAccountConfigType = {
  name: string
  sku: storageAccountSkuType
}

param storageAccountConfig storageAccountConfigType

resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = {
  name: storageAccountConfig.name
  location: location
  sku: {
    name: storageAccountConfig.sku
  }
  kind: 'StorageV2'
}

Etiketli birleşim türünü bildirme

Bicep dosyası içinde özel etiketli birleşim veri türü bildirmek için, kullanıcı tanımlı tür bildiriminin üzerine ayrıştırıcı bir dekoratör yerleştirebilirsiniz. Bu dekoratörü kullanmak için Bicep CLI sürüm 0.21.X veya üzeri gereklidir. Söz dizimi aşağıdaki gibidir:

@discriminator('<propertyName>')

Ayrımcı dekoratör, tüm birleşim üyeleri arasında paylaşılan özellik adını temsil eden tek bir parametre alır. Bu özellik adı tüm üyeler için gerekli bir dize değişmez değeri olmalıdır ve büyük/küçük harfe duyarlıdır. Birleşim üyelerindeki ayrımcı özelliğin değerleri büyük/küçük harfe duyarsız bir şekilde benzersiz olmalıdır.

Aşağıdaki örnekte etiketli birleşim türünün nasıl bildir olduğu gösterilmektedir:

type FooConfig = {
  type: 'foo'
  value: int
}

type BarConfig = {
  type: 'bar'
  value: bool
}

@discriminator('type')
type ServiceConfig = FooConfig | BarConfig | { type: 'baz', *: string }

param serviceConfig ServiceConfig = { type: 'bar', value: true }

output config object = serviceConfig

Parametre değeri, ayrımcı özellik değerine göre doğrulanır. Yukarıdaki örnekte serviceConfig parametre değeri foo türündeyse FooConfigtürü kullanılarak doğrulama yapılır. Benzer şekilde, parametre değeri çubuk türündeyse, doğrulama BarConfig türü kullanılarak gerçekleştirilir ve bu desen diğer türler için de devam eder.

Bicep dosyaları arasında türleri içeri aktarma (Önizleme)

Bu derleme zamanı içeri aktarma özelliğini kullanmak için Bicep CLI sürüm 0.21.X veya üzeri gereklidir. Deneysel bayrağın compileTimeImports Bicep yapılandırma dosyasından etkinleştirilmesi gerekir.

Yalnızca dekoratörü taşıyan @export() kullanıcı tanımlı veri türleri diğer şablonlara aktarılabilir. Şu anda bu dekoratör yalnızca deyimlerde type kullanılabilir.

Aşağıdaki örnek, diğer şablonlardan kullanıcı tanımlı iki veri türünü içeri aktarmanızı sağlar:

@export()
type myStringType = string

@export()
type myOtherStringType = myStringType

Daha fazla bilgi için bkz . Kullanıcı tanımlı veri türlerini içeri aktarma.

Sonraki adımlar