Door de gebruiker gedefinieerde gegevenstypen in Bicep

Informatie over het maken van door de gebruiker gedefinieerde gegevenstypen in Bicep. Zie Gegevenstypen voor door het systeem gedefinieerde gegevenstypen. Als u door de gebruiker gedefinieerde gegevenstypen gebruikt, wordt taalversie 2.0-code automatisch gegenereerd.

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

De linterregel voor door de gebruiker gedefinieerde typen moedigt het gebruik van door de gebruiker gedefinieerde gegevenstypen aan in plaats van de algemene object of array typen.

Typen definiëren

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

@<decorator>(<argument>)
type <user-defined-data-type-name> = <type-expression>

De @allowed decorator is alleen toegestaan op param statements. Als u een type wilt definiëren met een reeks vooraf gedefinieerde waarden in een type, gebruikt u de syntaxis voor een unie-type.

Geldige typeexpressies zijn:

Symbolische verwijzingen

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 literalen

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

Arraytypen

U kunt matrixtypen declareren door een geldige typeexpressie toe te [] voegen. Voorbeeld:

// 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)[]

Uniontypen

Met een samenvoegtype kunt u een gecombineerd type maken dat bestaat uit een set subtypen. Een waarde komt overeen met het type als deze overeenkomt met een van de subtypen. Gebruik de pipe-operator (|) om de afzonderlijke membertypen van elkaar te scheiden. Bicep vertaalt unietypen naar de beperking voor toegestane waarden, waardoor alleen letterlijke waarden als leden zijn toegestaan. Samenvoegingen kunnen een willekeurig aantal letterlijk getypte expressies bevatten.

type directions = 'east' | 'south' | 'west' | 'north'

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

U kunt samenvoegtypen inline declareren en een lid kan een verwijzing zijn naar een ander letterlijk getypt symbool.

Gemengde uniontypen

De ledentypen hoeven niet van hetzelfde soort letteraal te zijn. Een samenvoeging kan tekenreeks, geheel getal, Booleaanse waarde, object en null letterlijke waarden combineren.

type mixedType = 'fizz' | 42 | { an: 'object' } | null

Note

De | operator wordt ook gebruikt in verschillende gerelateerde scenario's die elders in dit artikel worden beschreven:

  • Zie Arraytypen als u een array wilt maken waarvan de elementen beperkt zijn tot unionleden.
  • Als u de | operator wilt koppelen aan de @discriminator() decorator en een gediscrimineerde samenvoeging wilt maken, raadpleegt u het gegevenstype Getagde samenvoeging.
  • Wanneer u resource-afgeleide typen gebruikt, worden hun uitgebreide equivalenten uitgedrukt als samenvoegingen.

Objecttypen

Objecttypen bevatten nul of meer eigenschappen tussen accolades:

type storageAccountConfigType = {
  name: string
  sku: string
}

Elke eigenschap in een object bestaat uit een sleutel en een waarde, van elkaar gescheiden door een dubbele punt :. De sleutel kan elke tekenreeks zijn, met niet-id-waarden tussen aanhalingstekens. De waarde kan elk type expressie 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?
}

U kunt decoratoren gebruiken op eigenschappen. U kunt een sterretje (*) gebruiken om ervoor te zorgen dat alle waarden een beperking vereisen. U kunt meer eigenschappen definiëren met behulp van *. In dit voorbeeld wordt een object gemaakt waarvoor een sleutel van het type int met de naam idis vereist. Alle andere vermeldingen in het object moeten een tekenreekswaarde van ten minste 10 tekens lang 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 directions = 'east' | 'south' | 'west' | 'north'

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

Recursie

Objecttypen kunnen directe of indirecte recursie gebruiken als ten minste het been van het pad naar het recursiepunt optioneel is. Zo is de myObjectType definitie in het volgende voorbeeld geldig omdat de direct recursieve recursiveProp eigenschap optioneel is:

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

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

type invalidRecursiveObjectType = {
  level1: {
    level2: {
      level3: {
        level4: {
         level5: invalidRecursiveObjectType
        }
      }
    }
  }
}

Unaire operators

Gebruik Bicep unaire operatoren 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. Bicep samenvoegingstypen vertaalt in de beperking voor toegestane waarden, zodat alleen letterlijke waarden zijn toegestaan als leden.

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

Gebruik type-expressies in de type-statement. U kunt ook typeexpressies gebruiken om door de gebruiker gedefinieerde gegevenstypen te maken, zoals wordt weergegeven op de volgende plaatsen.

  • Als de typeclausule van een param statement. 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@2025-06-01' = {
  name: storageAccountName
  location: location
  sku: {
    name: storageAccountSKU
  }
  kind: 'StorageV2'
}

Met door de gebruiker gedefinieerde gegevenstypen 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@2025-06-01' = {
  name: storageAccountConfig.name
  location: location
  sku: {
    name: storageAccountConfig.sku
  }
  kind: 'StorageV2'
}

Decorators gebruiken

Schrijf decorators in de notatie @expression en plaats ze boven de declaraties van het door de gebruiker gedefinieerde gegevenstype. In de volgende tabel ziet u de beschikbare decorators voor door de gebruiker gedefinieerde gegevenstypen.

Decorateur Van toepassing op Argumentatie Beschrijving
beschrijving Alles tekenreeks Geef beschrijvingen op voor het door de gebruiker gedefinieerde gegevenstype.
Discriminator Voorwerp tekenreeks Gebruik deze decorator om ervoor te zorgen dat de juiste subklasse wordt geïdentificeerd en beheerd.
exporteren Alles Geen Geeft aan dat het door de gebruiker gedefinieerde gegevenstype beschikbaar is voor importeren door een ander Bicep-bestand.
maxLength array, tekenreeks int (integer) De maximale lengte voor tekenreeks- en matrixgegevenstypen. De waarde is inclusief.
maxValue int (integer) int (integer) De maximale waarde voor de gegevenstypen voor gehele getallen. Deze waarde is inclusief.
metagegevens Alles Voorwerp Aangepaste eigenschappen die moeten worden toegepast op de gegevenstypen. Kan een beschrijvingseigenschap bevatten die gelijk is aan de beschrijvingsdecorator.
minLength array, tekenreeks int (integer) De minimale lengte voor tekenreeks- en matrixgegevenstypen. De waarde is inclusief.
minValue int (integer) int (integer) De minimumwaarde voor de gegevenstypen voor gehele getallen. Deze waarde is inclusief.
Verzegeld Voorwerp Geen Verhoog BCP089 van een waarschuwing naar een fout wanneer een eigenschapsnaam van een door de gebruiker gedefinieerd gegevenstype waarschijnlijk een typefout is. Zie Foutniveau verhogen voor meer informatie.
veilig tekenreeks, object Geen Markeert de typen als veilig. De waarde voor een beveiligd type wordt niet opgeslagen in de implementatiegeschiedenis en wordt niet geregistreerd. Zie Beveiligde tekenreeksen en objecten voor meer informatie.

Decorators bevinden zich in de sys-naamruimte. Als u een decorator wilt onderscheiden van een ander item met dezelfde naam, moet u de decorator vooraf laten gaan door sys. Als uw Bicep-bestand bijvoorbeeld een variabele met de naam descriptionbevat, moet u de sys naamruimte toevoegen wanneer u de description decorator gebruikt.

Onderscheider

Zie gegevenstype met labels.

Beschrijving

Voeg een beschrijving toe aan het door de gebruiker gedefinieerde gegevenstype. U kunt decoratoren gebruiken op eigenschappen. Voorbeeld:

@description('Define a new object type.')
type obj = {
  @description('The object ID')
  id: int

  @description('Additional properties')
  @minLength(10)
  *: string
}

U kunt markdown-opgemaakte tekst gebruiken voor de beschrijvingstekst.

Exporteren

Gebruik @export() dit om het door de gebruiker gedefinieerde gegevenstype te delen met andere Bicep-bestanden. Zie Variabelen, typen en functies exporteren voor meer informatie.

Beperkingen voor gehele getallen

Stel minimum- en maximumwaarden in voor het type geheel getal. U kunt een of beide beperkingen instellen.

@minValue(1)
@maxValue(12)
type month int

Lengtebeperkingen

Geef minimum- en maximumlengten op voor tekenreeks- en matrixtypen. U kunt een of beide beperkingen instellen. Voor tekenreeksen geeft de lengte het aantal tekens aan. Voor matrices geeft de lengte het aantal items in de matrix aan.

In het volgende voorbeeld worden twee typen gedeclareerd. Eén type is voor een opslagaccountnaam die 3 tot 24 tekens moet bevatten. Het andere type is een matrix die van één tot vijf items moet bevatten.

@minLength(3)
@maxLength(24)
type storageAccountName string

@minLength(1)
@maxLength(5)
type appNames array

Metagegevens

Als u aangepaste eigenschappen hebt die u wilt toepassen op een door de gebruiker gedefinieerd gegevenstype, voegt u een decorator voor metagegevens toe. Definieer binnen de metagegevens een object met de aangepaste namen en waarden. Het object dat u definieert voor de metagegevens kan eigenschappen van elke naam en elk type bevatten.

Gebruik deze decorator om informatie over het gegevenstype bij te houden dat niet zinvol is om aan de beschrijving toe te voegen.

@description('Configuration values that are applied when the application starts.')
@metadata({
  source: 'database'
  contact: 'Web team'
})
type settings object

Wanneer u een @metadata() decorator opgeeft met een eigenschap die conflicteert met een andere decorator, is de conflicterende eigenschap binnen de @metadata() waarde overbodig en vervangen. Zie Geen conflicterende metagegevens voor meer informatie.

Verzegeld

Zie Foutniveau verhogen.

Beveiligde typen

U kunt een door de gebruiker gedefinieerd gegevenstype voor een tekenreeks of object als veilig markeren. De waarde van een beveiligd type wordt niet opgeslagen in de implementatiegeschiedenis en wordt niet geregistreerd.

@secure()
type demoPassword string

@secure()
type demoSecretObject object

Foutniveau verhogen

Standaard kan het declareren van een objecttype in Bicep meer eigenschappen van elk type accepteren. De volgende Bicep is bijvoorbeeld geldig, maar geeft een waarschuwing van [BCP089]: The property "otionalProperty" is not allowed on objects of type "{ property: string, optionalProperty: null | string }". Did you mean "optionalProperty"?

type anObject = {
  property: string
  optionalProperty: string?
}

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

De waarschuwing geeft aan dat het anObject type geen eigenschap met de naam otionalPropertybevat. Hoewel er tijdens de implementatie geen fouten optreden, gaat de Bicep-compiler ervan uit dat otionalProperty een typefout is en dat u eigenlijk optionalProperty wilde gebruiken, maar het verkeerd hebt gespeld. Bicep waarschuwt u voor de inconsistentie.

Als u deze waarschuwingen wilt escaleren op fouten, past u de @sealed() decorator toe op het objecttype:

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

U krijgt dezelfde resultaten door de @sealed() decorator toe te passen op de param declaratie:

type anObject = {
  property: string
  optionalProperty: string?
}

@sealed()
param aParameter anObject = {
  property: 'value'
  otionalProperty: 'value'
}

De Implementatie-engine van Azure Resource Manager controleert ook verzegelde typen voor andere eigenschappen. Als u extra eigenschappen voor verzegelde parameters opgeeft, treedt er een validatiefout op, waardoor de implementatie mislukt. Voorbeeld:

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

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

Gegevenstype gelabelde samenvoeging

Als u binnen een Bicep-bestand een aangepast getagd union-gegevenstype wilt declareren, kunt u een discriminator-decorator boven de declaratie van een door de gebruiker gedefinieerd type plaatsen. Bicep CLI versie 0.21.X of hoger is vereist voor het gebruik van deze decorator. In het volgende voorbeeld ziet u hoe u een tagged union-gegevenstype definieert:

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

Zie Aangepast gegevenstype voor getagde unies voor meer informatie.

Resource-afgeleide typen

Bicep kunt u typen rechtstreeks afleiden uit Azure resourceschema's met behulp van de resourceInput<> en resourceOutput<> constructies. Door resource-afgeleide typen te gebruiken, kunt u parameters en variabelen controleren op een deel van een resourcebody in plaats van een aangepast type te gebruiken. Als u deze constructies wilt gebruiken, hebt u Bicep CLI-versie 0.34.1 of hoger nodig.

Sjablonen kunnen resourcetypen opnieuw gebruiken waar een type wordt verwacht.

resourceInput<'type@version'>
  • resourceInput<>: Vertegenwoordigt de beschrijfbare eigenschappen van een resourcetype, waarbij alle eigenschappen worden verwijderd die zijn gemarkeerd als ReadOnly in het ARM-sjabloonschema. Het gebruikt het type dat u moet doorgeven aan de resourcedeclaratie.
resourceOutput<'type@version'>
  • resourceOutput<>: Vertegenwoordigt de leesbare eigenschappen van een resourcetype, waarbij alle eigenschappen worden verwijderd die zijn gemarkeerd als WriteOnly in het ARM-sjabloonschema. Deze komt overeen met het type waarde dat wordt geretourneerd nadat de resource is geprovisioneerd.

U kunt resourceInput<> of resourceOutput<> toepassen om slechts een deel van een resourceschema te extraheren. Als u bijvoorbeeld een variabele of parameter wilt typen op basis van alleen kind of properties van een opslagaccount:

type accountKind = resourceInput<'Microsoft.Storage/storageAccounts@2024-01-01'>.kind

Het voorgaande voorbeeld is gelijk aan:

type accountKind = 'BlobStorage' | 'BlockBlobStorage' | 'FileStorage' | 'Storage' | 'StorageV2'

In het volgende voorbeeld ziet u hoe u met resourceInput<> een getypte parameter maakt op basis van de properties van een opslagaccountresource. Deze benadering definieert een parameter die overeenkomt met de beschrijfbare eigenschappen van een opslagaccount, zoals accessTier, minimumTlsVersionen andere eigenschappen:

// Typed parameter using the .properties path of a storage account
param storageAccountProps resourceInput<'Microsoft.Storage/storageAccounts@2023-01-01'>.properties = {
  accessTier: 'Hot'
  minimumTlsVersion: 'TLS1_2'
  allowBlobPublicAccess: false
  supportsHttpsTrafficOnly: true
}

// Resource declaration using the typed parameter
resource storageAccount 'Microsoft.Storage/storageAccounts@2025-06-01' = {
  name: 'mystorageacct123'
  location: resourceGroup().location
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
  properties: storageAccountProps
}

In het volgende voorbeeld ziet u hoe resourceOutput<> u een getypte uitvoer maakt op basis van de primaryEndPoints resource van een opslagaccount.

output storageEndpoints resourceOutput<'Microsoft.Storage/storageAccounts@2024-01-01'>.properties.primaryEndpoints = ...

In tegenstelling tot door de gebruiker gedefinieerde gegevenstypen, controleert Bicep door resources afgeleide typen wanneer u een bestand bewerkt of compileert, maar de ARM-service controleert deze niet.

Zie Gegevenstypen voor een lijst met de Bicep-gegevenstypen.