Aracılığıyla paylaş


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

Bicep'te kullanıcı tanımlı veri türleri oluşturmayı öğrenin. Sistem tanımlı veri türleri için bkz . Veri türleri.

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

Sözdizimi

Kullanıcı tanımlı veri türleri oluşturmak 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>

@allowed Dekoratöre yalnızca deyimlerde izin verilirparam. içinde önceden tanımlanmış değerler typekümesi olan bir tür bildirmek için birleşim türü söz dizimini kullanın.

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
    
  • Geçerli bir tür ifadesine ekleyerek [] dizi türlerini bildirebilirsiniz:

    // 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
    }
    

    Nesnedeki her özellik bir anahtardan ve iki nokta üst üste :ile ayrılmış bir değerden oluşur. Anahtar herhangi bir dize olabilir ve tırnak içine nonidentifier değerleri eklenebilir ve değer herhangi bir ifade türü 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ılırken *ek özellikler tanımlanabilir. Bu örnek, id türünde int 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 directions = 'east' | 'south' | 'west' | 'north'
    
    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@2023-04-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@2023-04-01' = {
  name: storageAccountConfig.name
  location: location
  sku: {
    name: storageAccountConfig.sku
  }
  kind: 'StorageV2'
}

Hata düzeyini yükseltme

Varsayılan olarak, Bicep'te bir nesne türünü bildirmek, herhangi bir türün ek özelliklerini kabul etmesine olanak tanır. Örneğin, aşağıdaki Bicep geçerlidir ancak [BCP089] The property "otionalProperty" is not allowed on objects of type "{ property: string, optionalProperty: null | string }". Did you mean "optionalProperty"?- uyarısını verir:

type anObject = {
  property: string
  optionalProperty: string?
}
 
param aParameter anObject = {
  property: 'value'
  otionalProperty: 'value'
}

Uyarı, anObject türünün otionalProperty adlı bir özellik içermediğini size bildirir. Dağıtım sırasında hata oluşmasa da, Bicep derleyicisi otionalProperty'nin bir yazım hatası olduğunu, isteğe bağlıProperty kullanmayı amaçladığınız ama yanlış yazdığını ve tutarsızlık konusunda sizi uyardığını varsayar.

Bu uyarıları hatalara ilerletmek için dekoratörü nesne türüne uygulayın @sealed() :

@sealed() 
type anObject = {
  property: string
  optionalProperty?: string
}

Dekoratörü param bildirime @sealed() uygulayarak aynı sonuçları elde edersiniz:

type anObject = {
  property: string
  optionalProperty: string?
}
 
@sealed() 
param aParameter anObject = {
  property: 'value'
  otionalProperty: 'value'
}

ARM dağıtım altyapısı, ek özellikler için korumalı türleri de denetler. Korumalı parametreler için ek özellikler sağlanması doğrulama hatasına neden olur ve dağıtımın başarısız olmasına neden olur. Örneğin:

@sealed()
type anObject = {
  property: string
}

param aParameter anObject = {
  property: 'value'
  optionalProperty: 'value'
}

Etiketli birleşim veri türü

Bicep dosyasında özel etiketli birleşim veri türü bildirmek için kullanıcı tanımlı tür bildiriminin üzerine bir discriminator dekoratör yerleştirebilirsiniz. Bu dekoratörü kullanmak için Bicep CLI sürüm 0.21.X veya üzeri gereklidir. Aşağıdaki örnekte etiketli birleşim veri türü bildirme 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

Daha fazla bilgi için bkz . Özel etiketli birleşim veri türü.

Bicep dosyaları arasında türleri içeri aktarma

Yalnızca dekoratörü taşıyan @export() kullanıcı tanımlı veri türleri diğer şablonlara aktarı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