Uživatelem definované datové typy v Bicep
Naučte se vytvářet uživatelem definované datové typy v Bicep. Informace o systémově definovaných datových typech najdete v tématu Datové typy. Použití uživatelem definovaných datových typů automaticky povolí generování kódu verze 2.0 .
K použití této funkce se vyžaduje rozhraní příkazového řádku Bicep verze 0.12.X nebo vyšší .
Definování typů
Tento příkaz můžete použít type
k vytvoření uživatelem definovaných datových typů. K definování vlastních typů můžete také použít výrazy typu na některých místech.
@<decorator>(<argument>)
type <user-defined-data-type-name> = <type-expression>
Dekorátor @allowed
je povolen pouze u param
příkazů. Chcete-li deklarovat typ se sadou předdefinovaných hodnot v příkazu type
, použijte syntaxi sjednocovacího typu.
Mezi platné výrazy typu patří:
Symbolické odkazy jsou identifikátory, které odkazují na okolní typ (například
string
neboint
) nebo symbol definovaného uživatelemtype
deklarovaný v příkazu:// Bicep data type reference type myStringType = string // user-defined type reference type myOtherStringType = myStringType
Primitivní literály, včetně řetězců, celých čísel a logických hodnot, jsou platné výrazy typu. Příklad:
// 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
Typy polí můžete deklarovat
[]
připojením k libovolnému platnému výrazu typu:// 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)[]
Typy objektů obsahují nula nebo více vlastností mezi složenými závorkami:
type storageAccountConfigType = { name: string sku: string }
Každá vlastnost v objektu se skládá z klíče a hodnoty oddělené dvojtečku
:
. Klíč může být libovolný řetězec s neidentifikátorovými hodnotami uzavřenými v uvozovkách. Hodnota může být libovolný typ výrazu.Vlastnosti jsou vyžadovány, pokud nemají za hodnotou vlastnosti značku
?
volitelné vlastnosti. Například vlastnost v následujícím příkladusku
je volitelná:type storageAccountConfigType = { name: string sku: string? }
Dekorátory můžete použít u vlastností. Pomocí hvězdičky (
*
) můžete nastavit, aby všechny hodnoty vyžadovaly omezení. Pomocí .*
Tento příklad vytvoří objekt, který vyžaduje klíč typuint
s názvemid
. Všechny ostatní položky v objektu musí být řetězcová hodnota minimálně 10 znaků dlouhá.type obj = { @description('The object ID') id: int @description('Additional properties') @minLength(10) *: string }
Následující ukázka ukazuje, jak pomocí syntaxe sjednocovacího typu vypsat sadu předdefinovaných hodnot:
type directions = 'east' | 'south' | 'west' | 'north' type obj = { level: 'bronze' | 'silver' | 'gold' }
Typy objektů můžou používat přímé nebo nepřímé rekurze, pokud je nepovinná alespoň noha cesty k bodu rekurze. Například definice v následujícím příkladu
myObjectType
je platná, protože přímo rekurzivnírecursiveProp
vlastnost je volitelná:type myObjectType = { stringProp: string recursiveProp: myObjectType? }
Následující definice typu by nebyla platná, protože žádná z
level1
,level2
,level3
,level4
, nebolevel5
je nepovinná.type invalidRecursiveObjectType = { level1: { level2: { level3: { level4: { level5: invalidRecursiveObjectType } } } } }
Unární operátory Bicep můžete použít s celočíselnou a logickou literály nebo odkazy na celočíselné nebo logické symboly literálů:
type negativeIntLiteral = -10 type negatedIntReference = -negativeIntLiteral type negatedBoolLiteral = !true type negatedBoolReference = !negatedBoolLiteral
Sjednocení můžou obsahovat libovolný počet výrazů typu literál. Typy sjednocení se překládají do omezení povolené hodnoty v Bicep, takže jako členy jsou povoleny pouze literály.
type oneOfSeveralObjects = {foo: 'bar'} | {fizz: 'buzz'} | {snap: 'crackle'} type mixedTypeArray = ('fizz' | 42 | {an: 'object'} | null)[]
V příkazu můžete použít výrazy type
typu a pomocí výrazů typů můžete také vytvářet uživatelsky definované datové typy, jak je znázorněno na následujících místech:
Jako klauzule
param
typu příkazu. Příklad:param storageAccountConfig { name: string sku: string }
Následuje za
:
vlastností typu objektu. Příklad:param storageAccountConfig { name: string properties: { sku: string } } = { name: 'store$(uniqueString(resourceGroup().id)))' properties: { sku: 'Standard_LRS' } }
[]
Předchází výrazu typu pole. Příklad:param mixedTypeArray ('fizz' | 42 | {an: 'object'} | null)[]
Typický soubor Bicep pro vytvoření účtu úložiště vypadá takto:
param location string = resourceGroup().location
param storageAccountName string
@allowed([
'Standard_LRS'
'Standard_GRS'
])
param storageAccountSKU string = 'Standard_LRS'
resource storageAccount 'Microsoft.Storage/storageAccounts@2023-04-01' = {
name: storageAccountName
location: location
sku: {
name: storageAccountSKU
}
kind: 'StorageV2'
}
U uživatelem definovaných datových typů to může vypadat takto:
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@2023-04-01' = {
name: storageAccountConfig.name
location: location
sku: {
name: storageAccountConfig.sku
}
kind: 'StorageV2'
}
Použití dekorátorů
Dekorátory jsou zapsány ve formátu @expression
a jsou umístěny nad deklaracemi uživatelem definovaného datového typu. Následující tabulka uvádí dostupné dekorátory pro uživatelem definované datové typy.
Dekoratér | Platí pro | Argument | Popis |
---|---|---|---|
popis | vše | string | Zadejte popis uživatelem definovaného datového typu. |
diskriminátor | objekt | string | Pomocí tohoto dekorátoru se ujistěte, že je identifikována a spravována správná podtřída. |
export | vše | Žádná | Označuje, že uživatelem definovaný datový typ je k dispozici pro import jiným souborem Bicep. |
maxLength | array, string | int | Maximální délka datových typů řetězců a polí. Hodnota je inkluzivní. |
maxValue | int | int | Maximální hodnota datových typů celých čísel. Tato hodnota je inkluzivní. |
metadata | vše | objekt | Vlastní vlastnosti, které se mají použít u datových typů. Může obsahovat vlastnost popisu, která odpovídá dekorátoru popisu. |
minLength | array, string | int | Minimální délka datových typů řetězců a polí. Hodnota je inkluzivní. |
minValue | int | int | Minimální hodnota datových typů celé číslo. Tato hodnota je inkluzivní. |
sealed | objekt | Žádná | Zvýšení úrovně BCP089 z upozornění na chybu, pokud je název vlastnosti uživatelem definovaného datového typu pravděpodobně překlep. Další informace naleznete v tématu Zvýšení úrovně chyby. |
zajistit | string, object | Žádná | Označí typy jako bezpečné. Hodnota zabezpečeného typu se neuloží do historie nasazení a nezaprotokoluje se. Další informace naleznete v tématu Zabezpečení řetězců a objektů. |
Dekorátory jsou v oboru názvů sys. Pokud potřebujete odlišit dekorátor od jiné položky se stejným názvem, předkožte dekorátorem .sys
Pokud například váš soubor Bicep obsahuje proměnnou s názvem description
, musíte přidat sys
obor názvů při použití dekorátoru description
.
Diskriminátor
Viz Označení sjednocovacího datového typu.
Popis
Přidejte popis k uživatelem definovanému datovému typu. Dekorátory můžete použít u vlastností. Příklad:
@description('Define a new object type.')
type obj = {
@description('The object ID')
id: int
@description('Additional properties')
@minLength(10)
*: string
}
Pro text popisu můžete použít text ve formátu Markdownu.
Export
Slouží @export()
ke sdílení uživatelem definovaného datového typu s jinými soubory Bicep. Další informace najdete v tématu Export proměnných, typů a funkcí.
Celočíselná omezení
Pro celočíselné typy můžete nastavit minimální a maximální hodnoty. Můžete nastavit jedno nebo obě omezení.
@minValue(1)
@maxValue(12)
type month int
Omezení délky
Pro typy řetězců a polí můžete zadat minimální a maximální délku. Můžete nastavit jedno nebo obě omezení. U řetězců délka označuje počet znaků. U polí určuje délka počet položek v matici.
Následující příklad deklaruje dva typy. Jedním typem je název účtu úložiště, který musí mít 3 až 24 znaků. Druhým typem je pole, které musí mít jednu až pět položek.
@minLength(3)
@maxLength(24)
type storageAccountName string
@minLength(1)
@maxLength(5)
type appNames array
Metadata
Pokud máte vlastní vlastnosti, které chcete použít u uživatelem definovaného datového typu, přidejte dekorátor metadat. V metadatech definujte objekt s vlastními názvy a hodnotami. Objekt, který definujete pro metadata, může obsahovat vlastnosti libovolného názvu a typu.
Tento dekorátor můžete použít ke sledování informací o datovém typu, který nemá smysl přidat do popisu.
@description('Configuration values that are applied when the application starts.')
@metadata({
source: 'database'
contact: 'Web team'
})
type settings object
Když poskytnete @metadata()
dekorátoru vlastnost, která je v konfliktu s jiným dekorátorem, má tento dekorátor vždy přednost před čímkoli v dekorátoru @metadata()
. Konfliktní vlastnost v rámci @metadata()
hodnoty je tedy redundantní a je nahrazena. Další informace naleznete v tématu Žádné konfliktní metadata.
Zapečetěný
Viz Úroveň chyby Zvýšení úrovně.
Typy zabezpečení
Jako zabezpečený můžete označit řetězec nebo objektově definovaný datový typ. Hodnota zabezpečeného typu se neuloží do historie nasazení a nezaprotokoluje se.
@secure()
type demoPassword string
@secure()
type demoSecretObject object
Zvýšení úrovně chyb
Ve výchozím nastavení deklarování typu objektu v Bicep umožňuje přijmout více vlastností libovolného typu. Například následující bicep je platný, ale vyvolá upozornění [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'
}
Upozornění vás informuje, že anObject
typ neobsahuje vlastnost s názvem otionalProperty
. I když během nasazování nedojde k žádným chybám, kompilátor Bicep předpokládá, že otionalProperty
jde o překlep a že jste ho chtěli použít optionalProperty
, ale chybně napsaný. Bicep vás upozorní na nekonzistence.
Chcete-li eskalovat tato upozornění na chyby, použijte @sealed()
dekorátor na typ objektu:
@sealed()
type anObject = {
property: string
optionalProperty?: string
}
Stejné výsledky získáte použitím @sealed()
dekorátoru param
na deklaraci:
type anObject = {
property: string
optionalProperty: string?
}
@sealed()
param aParameter anObject = {
property: 'value'
otionalProperty: 'value'
}
Modul nasazení Azure Resource Manager také kontroluje zapečetěné typy dalších vlastností. Poskytnutím jakýchkoli dalších vlastností zapečetěných parametrů dojde k chybě ověření, která způsobí selhání nasazení. Příklad:
@sealed()
type anObject = {
property: string
}
param aParameter anObject = {
property: 'value'
optionalProperty: 'value'
}
Označený sjednocovaný datový typ
Pokud chcete deklarovat vlastní sjednocovací datový typ v souboru Bicep, můžete umístit discriminator
dekorátor nad deklaraci typu definované uživatelem. K použití tohoto dekorátoru se vyžaduje rozhraní příkazového řádku Bicep verze 0.21.X nebo vyšší . Následující příklad ukazuje, jak deklarovat označený sjednocovacího datového typu:
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
Další informace naleznete v tématu Vlastní označený sjednocovacího datového typu.
Související obsah
Seznam datových typů Bicep najdete v tématu Datové typy.