Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Lär dig hur du skapar användardefinierade datatyper i Bicep. Information om systemdefinierade datatyper finns i Datatyper. Om du använder användardefinierade datatyper aktiveras automatiskt språkversion 2.0-kodgenerering .
Bicep CLI version 0.12.X eller senare krävs för att använda den här funktionen.
Linterregeln use-user-defined-types uppmuntrar till användning av användardefinierade datatyper i stället för de allmänna object eller array typerna.
Definiera typer
Använd -instruktionen type för att skapa användardefinierade datatyper. Du kan också använda typuttryck på vissa platser för att definiera anpassade typer.
@<decorator>(<argument>)
type <user-defined-data-type-name> = <type-expression>
Dekoratören @allowed är endast tillåten på param satser. Om du vill deklarera en typ med en uppsättning fördefinierade värden i en typeanvänder du syntax för unionstyp.
Giltiga typuttryck är:
Symboliska referenser
Symboliska referenser är identifierare som refererar till en omgivande typ (t.exstring. eller int) eller en användardefinierad typsymbol som deklareras i en type instruktion.
// Bicep data type reference
type myStringType = string
// user-defined type reference
type myOtherStringType = myStringType
Primitiva litteraler
Primitiva literaler, inklusive strängar, heltal och booleska, är giltiga typuttryck. Till exempel:
// 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
Matristyper
Du kan deklarera matristyper genom att lägga [] till valfritt giltigt typuttryck. Till exempel:
// 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)[]
Union-typer
Med en unionstyp kan du skapa en kombinerad typ som består av en uppsättning undertyper. Ett värde matchar typen om det matchar någon av undertyperna. Använd röroperatorn (|) för att separera de enskilda medlemstyperna. Bicep översätter unionstyper till begränsningen för tillåtna värden, så endast literaler tillåts som element. Unioner kan innehålla valfritt antal literaltypade uttryck.
type directions = 'east' | 'south' | 'west' | 'north'
type obj = {
level: 'bronze' | 'silver' | 'gold'
}
Du kan deklarera unionstyper direkt, och en medlem kan vara en referens till en annan symbol med literaltyp.
Unioner av blandad typ
Medlemstyperna behöver inte vara samma typ av literal. En union kan kombinera strängar, heltal, booleska objekt och null literaler.
type mixedType = 'fizz' | 42 | { an: 'object' } | null
Anmärkning
Operatorn | används också i flera relaterade scenarier som dokumenteras någon annanstans i den här artikeln:
- Information om hur du skapar en matris vars element är begränsade till unionsmedlemmar finns i Matristyper.
- Information om hur du kopplar operatorn
|till dekoratören@discriminator()och skapar en diskriminerad union finns i Taggad union-datatyp. - När du använder resursbaserade typer uttrycks deras utökade motsvarigheter som fackföreningar.
Objekttyper
Objekttyper innehåller noll eller fler egenskaper mellan klammerparenteser:
type storageAccountConfigType = {
name: string
sku: string
}
Varje egenskap i ett objekt består av en nyckel och ett värde avgränsat med ett kolon :. Nyckeln kan vara valfri sträng, med värden som inte är identifierade inom citattecken. Värdet kan vara vilken typ av uttryck som helst.
Egenskaper är obligatoriska om de inte följs av markeringen för valfrihet ? efter egenskapsvärdet. Egenskapen i följande exempel är till exempel sku valfri:
type storageAccountConfigType = {
name: string
sku: string?
}
Du kan använda dekoratorer på egenskaper. Du kan använda en asterisk (*) för att göra så att alla värden kräver en begränsning. Du kan definiera fler egenskaper med hjälp *av . Det här exemplet skapar ett objekt som kräver en nyckel av typen int med namnet id. Alla andra poster i objektet måste vara ett strängvärde som är minst 10 tecken långt.
type obj = {
@description('The object ID')
id: int
@description('Additional properties')
@minLength(10)
*: string
}
Följande exempel visar hur du använder syntaxen för unionstyp för att lista en uppsättning fördefinierade värden:
type directions = 'east' | 'south' | 'west' | 'north'
type obj = {
level: 'bronze' | 'silver' | 'gold'
}
Rekursion
Objekttyper kan använda direkt eller indirekt rekursion om åtminstone delen av sökvägen till rekursionspunkten är valfri. Definitionen i följande exempel är till exempel myObjectType giltig eftersom den direkt rekursiva recursiveProp egenskapen är valfri:
type myObjectType = {
stringProp: string
recursiveProp: myObjectType?
}
Följande typdefinition är inte giltig eftersom ingen av level1, level2, level3, level4eller level5 är valfri.
type invalidRecursiveObjectType = {
level1: {
level2: {
level3: {
level4: {
level5: invalidRecursiveObjectType
}
}
}
}
}
Unary-operatorer
Använd Bicep unary-operatorer med heltal och booleska literaler eller referenser till heltal eller booleska literaltypade symboler.
type negativeIntLiteral = -10
type negatedIntReference = -negativeIntLiteral
type negatedBoolLiteral = !true
type negatedBoolReference = !negatedBoolLiteral
Unioner kan innehålla valfritt antal literaltypade uttryck. Bicep översätter unionstyper till begränsningen för tillåtna värden, vilket innebär att endast literaler tillåts som medlemmar.
type oneOfSeveralObjects = {
foo: 'bar'
} | {
fizz: 'buzz'
} | {
snap: 'crackle'
}
type mixedTypeArray = ('fizz' | 42 | {an: 'object'} | null)[]
Använd typuttryck i type-satsen. Du kan också använda typuttryck för att skapa användardefinierade datatyper, som du ser på följande platser.
Som typvillkoret i en
param-sats. Till exempel:param storageAccountConfig { name: string sku: string }:Följ egenskapen i en objekttyp. Till exempel:param storageAccountConfig { name: string properties: { sku: string } } = { name: 'store$(uniqueString(resourceGroup().id)))' properties: { sku: 'Standard_LRS' } }Före
[]i ett matristypsuttryck. Till exempel:param mixedTypeArray ('fizz' | 42 | {an: 'object'} | null)[]
En typisk Bicep-fil för att skapa ett lagringskonto ser ut så här:
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'
}
Med användardefinierade datatyper kan det se ut så här:
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'
}
Använd dekoratörer
Skriv dekoratörer i formatet @expression och placera dem ovanför deklarationerna för den användardefinierade datatypen. I följande tabell visas tillgängliga dekoratörer för användardefinierade datatyper.
| Dekoratör | Använd på | Argumentation | beskrivning |
|---|---|---|---|
| beskrivning | alla | sträng | Ange beskrivningar för den användardefinierade datatypen. |
| diskriminator | objekt | sträng | Använd den här dekoratören för att säkerställa att rätt underklass identifieras och hanteras. |
| exportera | alla | inget | Anger att den användardefinierade datatypen är tillgänglig för import av en annan Bicep-fil. |
| maxLength | array, sträng | int | Maximal längd för sträng- och matrisdatatyper. Värdet är inkluderande. |
| maxValue | int | int | Det maximala värdet för heltalsdatatyperna. Det här värdet är inkluderande. |
| metadata | alla | objekt | Anpassade egenskaper som ska tillämpas på datatyperna. Kan innehålla en beskrivningsegenskap som motsvarar beskrivningsdekoratören. |
| minLength | array, sträng | int | Minsta längd för sträng- och matrisdatatyper. Värdet är inkluderande. |
| minValue | int | int | Minsta värde för heltalsdatatyperna. Det här värdet är inkluderande. |
| stängd | objekt | inget | Höj BCP089 från en varning till ett fel när ett egenskapsnamn för en användardefinierad datatyp sannolikt är ett skrivfel. Mer information finns i Höja felnivån. |
| säker | sträng, objekt | inget | Markerar typerna som säkra. Värdet för en säker typ sparas inte i distributionshistoriken och loggas inte. Mer information finns i Skydda strängar och objekt. |
Dekoratörer finns i sys-namnområdet. Om du behöver skilja en dekoratör från ett annat objekt med samma namn, föregå dekoratören med sys. Om din Bicep-fil till exempel innehåller en variabel med namnet descriptionmåste du lägga till sys namnområdet när du använder dekoratören description .
Diskriminator
beskrivning
Lägg till en beskrivning i den användardefinierade datatypen. Du kan använda dekoratorer på egenskaper. Till exempel:
@description('Define a new object type.')
type obj = {
@description('The object ID')
id: int
@description('Additional properties')
@minLength(10)
*: string
}
Du kan använda Markdown-formaterad text för beskrivningstexten.
Export
Använd @export() för att dela den användardefinierade datatypen med andra Bicep-filer. Mer information finns i Exportera variabler, typer och funktioner.
Heltalsbegränsningar
Ange lägsta och högsta värden för heltalstypen. Du kan ange en eller båda begränsningarna.
@minValue(1)
@maxValue(12)
type month int
Längdbegränsningar
Ange minsta och högsta längd för sträng- och matristyper. Du kan ange en eller båda begränsningarna. För strängar anger längden antalet tecken. För matriser anger längden antalet objekt i matrisen.
I följande exempel deklareras två typer. En typ är för ett lagringskontonamn som måste innehålla 3 till 24 tecken. Den andra typen är en matris som måste ha mellan ett och fem objekt.
@minLength(3)
@maxLength(24)
type storageAccountName string
@minLength(1)
@maxLength(5)
type appNames array
Metainformation
Om du har anpassade egenskaper som du vill tillämpa på en användardefinierad datatyp lägger du till en metadatadekoratör. I metadata definierar du ett objekt med anpassade namn och värden. Objektet som du definierar för metadata kan innehålla egenskaper för valfritt namn och typ.
Använd den här dekoratören för att spåra information om den datatyp som inte är lämplig att lägga till i beskrivningen.
@description('Configuration values that are applied when the application starts.')
@metadata({
source: 'database'
contact: 'Web team'
})
type settings object
När du anger en @metadata() dekoratör med en egenskap som står i konflikt med en annan dekoratör, är den motstridiga egenskapen i @metadata() värdet redundant och ersatt. Mer information finns i Inga motstridiga metadata.
Stängd
Se Höj felnivån.
Säkra typer
Du kan markera en sträng eller objekt som användardefinierad datatyp som säker. Värdet för en säker typ sparas inte i distributionshistoriken och loggas inte.
@secure()
type demoPassword string
@secure()
type demoSecretObject object
Höja felnivån
Om du deklarerar en objekttyp i Bicep kan den som standard acceptera fler egenskaper av vilken typ som helst. Till exempel är den följande Bicep giltig men ger upphov till varningen [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'
}
Varningen informerar dig om att anObject typen inte innehåller en egenskap med namnet otionalProperty. Även om inga fel uppstår under distributionen förutsätter Bicep-kompilatorn att det otionalProperty är ett stavfel och att du avsåg att använda optionalProperty men felstavade det. Bicep varnar dig för inkonsekvensen.
Om du vill eskalera dessa varningar till fel använder du dekoratören @sealed() på objekttypen:
@sealed()
type anObject = {
property: string
optionalProperty?: string
}
Du får samma resultat genom att tillämpa dekoratören @sealed() på deklarationen param :
type anObject = {
property: string
optionalProperty: string?
}
@sealed()
param aParameter anObject = {
property: 'value'
otionalProperty: 'value'
}
Azure Resource Manager-distributionsmotorn kontrollerar också förseglade typer för andra egenskaper. Om du anger eventuella extra egenskaper för förseglade parametrar resulterar det i ett valideringsfel som gör att distributionen misslyckas. Till exempel:
@sealed()
type anObject = {
property: string
}
param aParameter anObject = {
property: 'value'
optionalProperty: 'value'
}
taggad unionsdatatyp
Om du vill deklarera en anpassad taggad unionsdatatyp i en Bicep-fil kan du placera en discriminator-dekorator ovanför en användardefinierad typdeklaration.
Bicep CLI version 0.21.X eller senare krävs för att använda den här dekoratören. I följande exempel visas hur du deklarerar en taggad unionsdatatyp:
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
Mer information finns i Anpassad taggad unionsdatatyp.
Resursbaserade typer
Bicep gör det möjligt att härleda typer direkt från Azure-resursscheman genom att använda konstruktionerna resourceInput<> och resourceOutput<>. Genom att använda resursbaserade typer kan du kontrollera parametrar och variabler mot en del av en resurstext i stället för att använda en anpassad typ. Om du vill använda dessa konstruktioner behöver du Bicep CLI version 0.34.1 eller senare.
Mallar kan återanvända resurstyper där en typ förväntas.
resourceInput<'type@version'>
-
resourceInput<>: Representerar skrivbara egenskaper för en resurstyp och tar bort alla egenskaper som har markerats som ReadOnly i ARM-mallschemat. Den använder den typ som du behöver ange i resursdeklarationen.
resourceOutput<'type@version'>
-
resourceOutput<>: Representerar de läsbara egenskaperna för en resurstyp och tar bort alla egenskaper som markerats som WriteOnly i ARM-mallschemat. Den matchar den typ av värde som returneras när resursen har tillhandahållits.
Du kan bara använda resourceInput<> eller resourceOutput<> extrahera en del av ett resursschema. Om du till exempel vill skriva en variabel eller parameter baserat på bara kind eller properties för ett lagringskonto:
type accountKind = resourceInput<'Microsoft.Storage/storageAccounts@2024-01-01'>.kind
Föregående exempel motsvarar:
type accountKind = 'BlobStorage' | 'BlockBlobStorage' | 'FileStorage' | 'Storage' | 'StorageV2'
I följande exempel visas hur du använder resourceInput<> för att skapa en typad parameter baserat på properties en lagringskontoresurs. Den här metoden definierar en parameter som matchar de skrivbara egenskaperna för ett lagringskonto, till exempel accessTier, minimumTlsVersionoch andra egenskaper:
// 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
}
I följande exempel visas hur du använder resourceOutput<> för att skapa ett typat utdata baserat på primaryEndPoints för en lagringskontoresurs.
output storageEndpoints resourceOutput<'Microsoft.Storage/storageAccounts@2024-01-01'>.properties.primaryEndpoints = ...
Till skillnad från användardefinierade datatyper kontrollerar Bicep resursbaserade typer när du redigerar eller kompilerar en fil, men ARM-tjänsten kontrollerar dem inte.
Relaterat innehåll
En lista över Bicep-datatyperna finns i Datatyper.