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
ofint
) of een door de gebruiker gedefinieerd typesymbool dat in eentype
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. Desku
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 naamid
is 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 recursieverecursiveProp
eigenschap optioneel is:type myObjectType = { stringProp: string recursiveProp: myObjectType? }
Maar de volgende typedefinitie is niet geldig omdat geen van
level1
,level2
,level3
oflevel4
level5
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.