Door de gebruiker gedefinieerde gegevenstypen in Bicep

Meer informatie over het gebruik van door de gebruiker gedefinieerde gegevenstypen in Bicep.

Bicep CLI versie 0.12.X of hoger is vereist voor het gebruik van deze functie.

Door de gebruiker gedefinieerde syntaxis voor gegevenstypen

U kunt de instructie gebruiken om door de type gebruiker gedefinieerde gegevenstypen te definiëren. Daarnaast kunt u op sommige plaatsen ook typeexpressies gebruiken om aangepaste typen te definiëren.

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

Notitie

De @allowed decorator is alleen toegestaan op param instructies. Als u wilt declareren dat een eigenschap een van een set vooraf gedefinieerde waarden in een type of output instructie moet zijn, gebruikt u de syntaxis van het samenvoegtype. Syntaxis van het samenvoegtype kan ook worden gebruikt in param instructies.

De geldige typeexpressies zijn onder andere:

  • Symbolische verwijzingen zijn id's die verwijzen naar een omgevingstype (zoals string of int) of een door de gebruiker gedefinieerd typesymbool dat in een type instructie is gedeclareerd:

    // Bicep data type reference
    type myStringType = string
    
    // user-defined type reference
    type myOtherStringType = myStringType
    
  • Primitieve letterlijke waarden, waaronder tekenreeksen, gehele getallen en booleaanse waarden, zijn geldige typeexpressies. Voorbeeld:

    // 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
    
  • Matrixtypen kunnen worden gedeclareerd door achtervoegsel [] te gebruiken voor elke geldige typeexpressie:

    // 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)[]
    
  • Objecttypen bevatten nul of meer eigenschappen tussen accolades:

    type storageAccountConfigType = {
      name: string
      sku: string
    }
    

    Elke eigenschap in een object bestaat uit sleutel en waarde. De sleutel en waarde worden gescheiden door een dubbele punt :. De sleutel kan een tekenreeks zijn (waarden die geen geldige id moeten zijn tussen aanhalingstekens) en de waarde kan een syntaxisexpressie van het type zijn.

    Eigenschappen zijn vereist, tenzij ze een optionele markering ? hebben na de eigenschapswaarde. De sku eigenschap in het volgende voorbeeld is bijvoorbeeld optioneel:

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

    Decorators kunnen worden gebruikt voor eigenschappen. * kan worden gebruikt om alle waarden een beperking te maken. Er kunnen nog steeds aanvullende eigenschappen worden gedefinieerd wanneer u deze gebruikt *. In dit voorbeeld wordt een object gemaakt waarvoor een sleutel van het type met de naam idis vereist en dat alle andere vermeldingen in het object een tekenreekswaarde van ten minste 10 tekens lang moeten zijn.

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

    In het volgende voorbeeld ziet u hoe u de syntaxis van het samenvoegtype gebruikt om een set vooraf gedefinieerde waarden weer te geven:

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

    Recursie

    Objecttypen kunnen directe of indirecte recursie gebruiken, zolang ten minste het been van het pad naar het recursiepunt optioneel is. De definitie in het volgende voorbeeld is bijvoorbeeld myObjectType geldig omdat de rechtstreeks recursieve recursiveProp eigenschap optioneel is:

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

    Maar de volgende typedefinitie is niet geldig omdat geen vanlevel1, level2, level3of level4level5 optioneel is.

    type invalidRecursiveObjectType = {
      level1: {
        level2: {
          level3: {
            level4: {
              level5: invalidRecursiveObjectType
            }
          }
        }
      }
    }
    
  • Bicep unaire operatoren kunnen worden gebruikt met geheel getal en booleaanse letterlijke waarden of verwijzingen naar geheel getal- of booleaanse letterlijke symbolen:

    type negativeIntLiteral = -10
    type negatedIntReference = -negativeIntLiteral
    
    type negatedBoolLiteral = !true
    type negatedBoolReference = !negatedBoolLiteral
    
  • Samenvoegingen kunnen een willekeurig aantal letterlijk getypte expressies bevatten. Samenvoegtypen worden omgezet in de beperking voor toegestane waarden in Bicep, zodat alleen letterlijke waarden zijn toegestaan als leden.

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

Naast gebruik in de type instructie kunnen typeexpressies ook worden gebruikt op deze plaatsen voor het maken van door de gebruiker gedefinieerde gegevenstypen:

  • Als de typecomponent van een param instructie. Voorbeeld:

    param storageAccountConfig {
      name: string
      sku: string
    }
    
  • Volg de : eigenschap in een objecttype. Voorbeeld:

    param storageAccountConfig {
     name: string
      properties: {
        sku: string
      }
    } = {
      name: 'store$(uniqueString(resourceGroup().id)))'
      properties: {
        sku: 'Standard_LRS'
      }
    }
    
  • Voorafgaande aan de [] expressie van een matrixtype. Voorbeeld:

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

Een typisch Bicep-bestand voor het maken van een opslagaccount ziet er als volgt uit:

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

Door de gebruiker gedefinieerde gegevenstypen te gebruiken, kan deze er als volgt uitzien:

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

Getagd samenvoegingstype declareren

Als u een aangepast gegevenstype voor een gelabelde samenvoeging wilt declareren in een Bicep-bestand, kunt u een discriminator-decorator plaatsen boven een door de gebruiker gedefinieerde typedeclaratie. Bicep CLI versie 0.21.X of hoger is vereist voor het gebruik van deze decorator. De syntaxis is:

@discriminator('<propertyName>')

De discriminator-decorator heeft één parameter, die een gedeelde eigenschapsnaam vertegenwoordigt voor alle leden van de vereniging. Deze eigenschapsnaam moet een vereiste letterlijke tekenreeks voor alle leden zijn en is hoofdlettergevoelig. De waarden van de gediscrimineerde eigenschap van de leden van de unie moeten uniek zijn op een niet-hoofdlettergevoelige manier.

In het volgende voorbeeld ziet u hoe u een getagd samenvoegtype declareert:

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

De parameterwaarde wordt gevalideerd op basis van de gediscrimineerde eigenschapswaarde. Als in het voorgaande voorbeeld de parameterwaarde serviceConfig van het type foo is, wordt de validatie uitgevoerd met behulp van het FooConfig-type. Als de parameterwaarde van het typebalk is, wordt validatie uitgevoerd met het Type BarConfig en wordt dit patroon ook voortgezet voor andere typen.

Importtypen tussen Bicep-bestanden (preview)

Bicep CLI versie 0.21.X of hoger is vereist voor het gebruik van deze functie voor het importeren van compilatietijd. De experimentele vlag compileTimeImports moet zijn ingeschakeld vanuit het Bicep-configuratiebestand.

Alleen door de gebruiker gedefinieerde gegevenstypen met de @export() decorator kunnen worden geïmporteerd in andere sjablonen. Op dit moment kan deze decorator alleen worden gebruikt voor type instructies.

In het volgende voorbeeld kunt u de twee door de gebruiker gedefinieerde gegevenstypen importeren uit andere sjablonen:

@export()
type myStringType = string

@export()
type myOtherStringType = myStringType

Zie Door de gebruiker gedefinieerde gegevenstypen importeren voor meer informatie.

Volgende stappen