Uživatelem definované datové typy v Bicep
Naučte se používat uživatelem definované datové typy v Bicep.
K použití této funkce se vyžaduje rozhraní příkazového řádku Bicep verze 0.12.X nebo vyšší .
Syntaxe datového typu definovaná uživatelem
Příkaz můžete použít type
k definování uživatelem definovaných datových typů. Kromě toho můžete k definování vlastních typů použít také výrazy typu na některých místech.
type <user-defined-data-type-name> = <type-expression>
Poznámka:
Dekorátor @allowed
je povolen pouze u param
příkazů. Chcete-li deklarovat, že vlastnost musí být jednou ze sady předdefinovaných hodnot v type
příkazu nebo output
příkazu, použijte syntaxi sjednocovacího typu. Syntaxi typu sjednocení lze použít také v param
příkazech.
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í lze deklarovat příponou
[]
libovolného platného 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. Klíč a hodnota jsou odděleny dvojtečka
:
. Klíč může být libovolný řetězec (hodnoty, které by nebyl platný identifikátor, musí být uzavřeny v uvozovkách) a hodnota může být libovolný výraz syntaxe typu.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 lze použít u vlastností.
*
lze použít k tomu, aby všechny hodnoty vyžadovaly omezení. Při použití*
mohou být stále definovány další vlastnosti . Tento příklad vytvoří objekt, který vyžaduje klíč typu int s názvemid
, a že všechny ostatní položky v objektu musí být řetězcová hodnota nejméně 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 obj = { level: 'bronze' | 'silver' | 'gold' }
Rekurze
Typy objektů můžou používat přímé nebo nepřímé rekurze, pokud je alespoň noha cesty k bodu rekurze volitelná. 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 ale 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 lze použít s celočíselnou a logickou literály nebo odkazy na celočíselné nebo logické symboly typu 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)[]
Kromě použití v type
příkazu je možné výrazy typů použít také na těchto místech pro vytváření uživatelsky definovaných datových typů:
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@2022-09-01' = {
name: storageAccountName
location: location
sku: {
name: storageAccountSKU
}
kind: 'StorageV2'
}
Pomocí uživatelem definovaných datových typů 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@2022-09-01' = {
name: storageAccountConfig.name
location: location
sku: {
name: storageAccountConfig.sku
}
kind: 'StorageV2'
}
Deklarace označeného typu sjednocení
Pokud chcete deklarovat vlastní sjednocovací datový typ v souboru Bicep, můžete diskriminátor umístit nad deklarování typu definovaného uživatelem. K použití tohoto dekorátoru se vyžaduje rozhraní příkazového řádku Bicep verze 0.21.X nebo vyšší . Syntaxe je:
@discriminator('<propertyName>')
Nediskriminační dekorátor přebírá jeden parametr, který představuje název sdílené vlastnosti mezi všemi členy sjednocení. Tento název vlastnosti musí být povinný řetězcový literál pro všechny členy a rozlišují se malá a velká písmena. Hodnoty diskriminované vlastnosti členů sjednocení musí být jedinečné způsobem bez rozlišování malých a malých písmen.
Následující příklad ukazuje, jak deklarovat označený typ sjednocení:
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
Hodnota parametru je ověřena na základě diskriminované hodnoty vlastnosti. Pokud je hodnota parametru serviceConfig v předchozím příkladu typu foo, prochází ověřením pomocí typu FooConfig. Podobně platí, že pokud je hodnota parametru typu pruh, provede se ověření pomocí typu BarConfig a tento vzor bude pokračovat i pro jiné typy.
Import typů mezi soubory Bicep (Preview)
K použití této funkce importu v čase kompilace se vyžaduje rozhraní příkazového řádku Bicep verze 0.21.X nebo vyšší . Experimentální příznak compileTimeImports
musí být povolený z konfiguračního souboru Bicep.
Do jiných šablon lze importovat pouze uživatelem definované datové typy, které nesou @export()
dekorátor. V současné době lze tento dekorátor použít pouze u type
příkazů.
Následující příklad umožňuje importovat dva uživatelem definované datové typy z jiných šablon:
@export()
type myStringType = string
@export()
type myOtherStringType = myStringType
Další informace naleznete v tématu Import uživatelem definovaných datových typů.
Další kroky
- Seznam datových typů Bicep najdete v tématu Datové typy.