Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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
paramstatement. 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
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.
Gerelateerde inhoud
Zie Gegevenstypen voor een lijst met de Bicep-gegevenstypen.