Typy danych w Bicep
W tym artykule opisano typy danych obsługiwane w aplikacji Bicep. Aby zdefiniować niestandardowe typy danych, zobacz Typy danych zdefiniowanych przez użytkownika.
Tablice
Tablice zaczynają się od lewego nawiasu kwadratowego ([
) i kończą się prawym nawiasem kwadratowym (]
). W Bicep można zadeklarować tablicę w jednym wierszu lub w wielu wierszach. Przecinki (,
) są używane między wartościami w deklaracjach jednowierszowych, ale nie są używane w deklaracjach wielowierszowych. Można mieszać i dopasowywać deklaracje jednowierszowe i wielowierszowe. Deklaracja wielowierszowa wymaga interfejsu wiersza polecenia Bicep w wersji 0.7.X lub nowszej.
var multiLineArray = [
'abc'
'def'
'ghi'
]
var singleLineArray = ['abc', 'def', 'ghi']
var mixedArray = ['abc', 'def'
'ghi']
Każdy element tablicy może być dowolnego typu. Możesz mieć tablicę, w której każdy element jest tym samym typem danych lub tablicą, która zawiera różne typy danych.
W poniższym przykładzie przedstawiono tablicę liczb całkowitych i tablicę różnych typów.
var integerArray = [
1
2
3
]
var mixedArray = [
resourceGroup().name
1
true
'example string'
]
Tablice w Bicep są oparte na zerze. W poniższym przykładzie wyrażenie exampleArray[0]
daje w wyniku wartość 1 i exampleArray[2]
daje wartość 3. Indeks indeksatora może być innym wyrażeniem. Wyrażenie exampleArray[index]
daje wartość 2. Indeksatory liczb całkowitych są dozwolone tylko w wyrażeniu typów tablic.
var index = 1
var exampleArray = [
1
2
3
]
Gdy indeks jest poza granicami, występuje następujący błąd:
The language expression property array index 'x' is out of bounds
Aby uniknąć tego wyjątku, użyj operatora logicznego Or, jak pokazano w poniższym przykładzie:
param emptyArray array = []
param numberArray array = [1, 2, 3]
output foo bool = empty(emptyArray) || emptyArray[0] == 'bar'
output bar bool = length(numberArray) <= 3 || numberArray[3] == 4
Operatory związane z tablicą
- Użyj operatorów porównania, aby porównać dwie tablice.
- Użyj metody dostępu indeksu, aby pobrać element z tablicy.
- Użyj operatora Safe-dereference, aby uzyskać dostęp do elementów tablicy.
- Użyj funkcji Spread , aby scalić tablice.
Funkcje związane z tablicą
Wartości logiczne
Po określeniu wartości logicznych użyj wartości true
lub false
. Nie otaczaj wartości znakami cudzysłowu.
param exampleBool bool = true
Operatory związane z wartością logiczną
- Użyj operatorów porównania, aby porównać wartości logiczne.
- Zobacz Operatory logiczne.
Funkcje związane z wartością logiczną
Zobacz Funkcja logiczna
Liczby całkowite
Po określeniu wartości całkowitych nie używaj cudzysłowów.
param exampleInt int = 1
Liczby całkowite Bicep są 64-bitowymi liczbami całkowitymi. Po przekazaniu ich jako parametrów wbudowanych zestaw SDK lub narzędzie wiersza polecenia używane do wdrożenia może ograniczyć zakres wartości. Jeśli na przykład używasz programu PowerShell do wdrażania Bicep, typy liczb całkowitych mogą wahać się od -2147483648 do 2147483647. Aby uniknąć tego ograniczenia, określ duże wartości całkowite w pliku parametrów. Typy zasobów stosują własne limity dla właściwości całkowitych.
Bicep obsługuje typ literału liczby całkowitej, który odwołuje się do określonej wartości, która jest dokładną liczbą całkowitą. W poniższym przykładzie 1
jest typem literału liczby całkowitej i foo
można przypisać tylko wartość 1
i żadną inną wartość.
output foo 1 = 1
Typ literału liczby całkowitej można zadeklarować w tekście, jak pokazano w poprzednim przykładzie lub w instrukcjitype
.
type oneType = 1
output foo oneType = 1
output bar oneType = 2
W poprzednim przykładzie przypisanie 2
do bar
wyników powoduje błąd BCP033 : "Oczekiwano wartości typu 1
, ale podana wartość jest typu 2
."
W poniższym przykładzie użyto typu literału liczby całkowitej z typem unii:
output bar 1 | 2 | 3 = 3
Formaty zmiennoprzecinkowe, dziesiętne lub binarne nie są obecnie obsługiwane.
Operatory związane z liczbą całkowitą
Funkcje związane z liczbą całkowitą
Zobacz Funkcje liczbowe.
Obiekty
Obiekty zaczynają się od lewego nawiasu klamrowego ({
) i kończą się prawym nawiasem klamrowym (}
). W Bicep można zadeklarować obiekt w jednym wierszu lub w wielu wierszach. Każda właściwość w obiekcie składa się z klucza i wartości. Klucz i wartość są oddzielone dwukropkiem (:
). Obiekt zezwala na dowolną właściwość dowolnego typu. Przecinki (,
) są używane między właściwościami deklaracji jednowierszowych, ale nie są używane między właściwościami dla deklaracji wielowierszowych. Można mieszać i dopasowywać deklaracje jednowierszowe i wielowierszowe. Deklaracja wielowierszowa wymaga interfejsu wiersza polecenia Bicep w wersji 0.7.X lub nowszej.
param singleLineObject object = {name: 'test name', id: '123-abc', isCurrent: true, tier: 1}
param multiLineObject object = {
name: 'test name'
id: '123-abc'
isCurrent: true
tier: 1
}
param mixedObject object = {name: 'test name', id: '123-abc', isCurrent: true
tier: 1}
W Bicep znaki cudzysłowu są opcjonalnie dozwolone w kluczach właściwości obiektu:
var test = {
'my - special. key': 'value'
}
W poprzednim przykładzie znaki cudzysłowu są używane, gdy klucze właściwości obiektu zawierają znaki specjalne. Przykłady to spacja, -
lub .
. W poniższym przykładzie pokazano, jak używać interpolacji w kluczach właściwości obiektu.
var stringVar = 'example value'
var objectVar = {
'${stringVar}': 'this value'
}
Metody dostępu do właściwości są używane do uzyskiwania dostępu do właściwości obiektu. Są one konstruowane przy użyciu .
operatora .
var a = {
b: 'Dev'
c: 42
d: {
e: true
}
}
output result1 string = a.b // returns 'Dev'
output result2 int = a.c // returns 42
output result3 bool = a.d.e // returns true
Metody dostępu do właściwości można używać z dowolnym obiektem, w tym parametrami i zmiennymi typów obiektów i literałów obiektów. Metoda dostępu do właściwości używana w wyrażeniu typu nieobiektu jest błędem.
Możesz również użyć []
składni, aby uzyskać dostęp do właściwości. Poniższy przykład zwraca wartość Development
.
var environmentSettings = {
dev: {
name: 'Development'
}
prod: {
name: 'Production'
}
}
output accessorResult string = environmentSettings['dev'].name
W formacie JSON obiekt jest nieurządkowaną kolekcją par klucz lub wartość zero lub więcej. Kolejność może się różnić w zależności od implementacji. Na przykład funkcja Bicep items() sortuje obiekty w kolejności alfabetycznej. W innych miejscach można zachować oryginalną kolejność. Ze względu na ten niedeterminizm należy unikać wprowadzania wszelkich założeń dotyczących porządkowania kluczy obiektów podczas pisania kodu, który wchodzi w interakcje z parametrami i danymi wyjściowymi wdrożenia.
Podczas uzyskiwania dostępu do nieistniejącej właściwości obiektu występuje następujący błąd:
The language expression property 'foo' doesn't exist
Aby uniknąć wyjątku, możesz użyć operatora logicznego And, jak pokazano w poniższym przykładzie:
param objectToTest object = {
one: 1
two: 2
three: 3
}
output bar bool = contains(objectToTest, 'four') && objectToTest.four == 4
Operatory związane z obiektami
- Użyj operatorów porównania, aby porównać obiekty.
- Użyj metody dostępu indeksu, aby uzyskać właściwość z obiektu.
- Użyj operatora Safe-dereference, aby uzyskać dostęp do elementów członkowskich obiektów.
- Użyj polecenia Spread , aby scalić obiekty.
Funkcje związane z obiektami
Zobacz Funkcje obiektu.
Ciągi
W Bicep ciągi są oznaczone pojedynczym cudzysłowem i należy je zadeklarować w jednym wierszu. Wszystkie znaki Unicode z punktami kodu między 0
i 10FFFF
są dozwolone.
param exampleString string = 'test value'
W poniższej tabeli wymieniono zestaw znaków zarezerwowanych, które należy użyć znaku ukośnika odwrotnego (\
):
Sekwencja ucieczki | Reprezentowana wartość | Uwagi |
---|---|---|
\\ |
\ |
|
\' |
' |
|
\n |
Źródło danych liniowych (LF) | |
\r |
Powrót karetki (CR) | |
\t |
Znak tabulacji | |
\u{x} |
Punkt kodu Unicode x |
Obiekt x reprezentuje wartość punktu kodu szesnastkowego między 0 i 10FFFF (włącznie). Zera wiodące są dozwolone. Powyższe FFFF punkty kodu są emitowane jako para zastępcza. |
\$ |
$ |
Tylko w przypadku ucieczki, gdy następuje { ciąg . |
// evaluates to "what's up?"
var myVar = 'what\'s up?'
Bicep obsługuje typ literału ciągu, który odwołuje się do określonej wartości ciągu. W poniższym przykładzie red
jest typem literału ciągu. Wartość można przypisać red
tylko do redColor
.
output redColor 'red' = 'red'
Można zadeklarować typ literału ciągu w tekście, jak pokazano w poprzednim przykładzie lub w instrukcjitype
.
type redColor = 'red'
output colorRed redColor = 'red'
output colorBlue redColor = 'blue'
W poprzednim przykładzie przypisanie blue
do colorBlue
wyników powoduje błąd BCP033 : "Oczekiwano wartości typu red
, ale podana wartość jest typu blue
."
W poniższym przykładzie pokazano typ literału ciągu używany z typem unii:
type direction = 'north' | 'south' | 'east' | 'west'
output west direction = 'west'
output northWest direction = 'northwest'
Wszystkie ciągi w Bicep obsługują interpolację. Aby wstrzyknąć wyrażenie, umieść je w ${
elementach i }
. Przywoływane wyrażenia nie mogą obejmować wielu wierszy.
var storageName = 'storage${uniqueString(resourceGroup().id)}'
Ciągi wielowierszowe
W Bicep ciągi wielowierszowe są definiowane między trzema pojedynczymi cudzysłowami ('''
), a następnie opcjonalnie przez nową linię (sekwencję otwierającą) i trzy pojedyncze cudzysłowy ('''
jest sekwencją zamykającą). Znaki wprowadzone między sekwencją otwierającą i zamykającą są odczytywane dosłownie. Ucieczka nie jest konieczna ani możliwa.
Uwaga
Analizator Bicep odczytuje wszystkie znaki w następujący sposób. W zależności od zakończenia wiersza pliku Bicep nowe linie są interpretowane jako \r\n
albo \n
.
Interpolacja nie jest obecnie obsługiwana w ciągach wielowierszowych. Ze względu na to ograniczenie może być konieczne użycie concat
funkcji zamiast interpolacji.
Ciągi wielowierszowe, które zawierają '''
, nie są obsługiwane.
// evaluates to "hello!"
var myVar = '''hello!'''
// evaluates to "hello!" because the first newline is skipped
var myVar2 = '''
hello!'''
// evaluates to "hello!\n" because the final newline is included
var myVar3 = '''
hello!
'''
// evaluates to " this\n is\n indented\n"
var myVar4 = '''
this
is
indented
'''
// evaluates to "comments // are included\n/* because everything is read as-is */\n"
var myVar5 = '''
comments // are included
/* because everything is read as-is */
'''
// evaluates to "interpolation\nis ${blocked}"
// note ${blocked} is part of the string, and is not evaluated as an expression
var myVar6 = '''interpolation
is ${blocked}'''
Operatory związane z ciągami
- Zobacz Operatory porównania.
Funkcje związane z ciągami
Typy unii
W Bicep typ unii umożliwia utworzenie połączonego typu, który składa się z zestawu podtypów. Przypisanie jest prawidłowe, jeśli dowolne z poszczególnych przypisań podtypów jest dozwolone. Znak |
oddziela poszczególne podtypy, które używają or
warunku. Na przykład składnia a | b
oznacza, że prawidłowe przypisanie może mieć a
wartość lub b
. Typy unii są tłumaczone na ograniczenie dozwolonej wartości w Bicep, więc tylko literały są dozwolone jako elementy członkowskie. Związki mogą zawierać dowolną liczbę wyrażeń typowych literałów.
type color = 'Red' | 'Blue' | 'White'
type trueOrFalse = 'true' | 'false'
type permittedIntegers = 1 | 2 | 3
type oneOfSeveralObjects = {foo: 'bar'} | {fizz: 'buzz'} | {snap: 'crackle'}
type mixedTypeArray = ('fizz' | 42 | {an: 'object'} | null)[]
Związki typów muszą być reducible do pojedynczego typu usługi Azure Resource Manager, takiego jak string
, int
lub bool
. W przeciwnym razie zostanie wyświetlony kod błędu BCP294 . Na przykład:
type foo = 'a' | 1
Możesz użyć dowolnego wyrażenia typu jako podtypu w deklaracji typu unii (między znakami |
). Na przykład wszystkie poniższe przykłady są prawidłowe:
type foo = 1 | 2
type bar = foo | 3
type baz = bar | (4 | 5) | 6
Typ danych unii z tagiem niestandardowym
Bicep obsługuje niestandardowy typ danych unii oznaczonej tagiem, który służy do reprezentowania wartości, która może być jedną z kilku typów. Aby zadeklarować typ danych unii z tagiem niestandardowym, możesz użyć dekoratora @discriminator()
. Do korzystania z tego dekoratora wymagany jest interfejs wiersza polecenia Bicep w wersji 0.21.X lub nowszej . Składnia jest następująca:
@discriminator('<property-name>')
Dekorator dyskryminujący przyjmuje jeden parametr, który reprezentuje nazwę właściwości udostępnionej wśród wszystkich składowych unii. Ta nazwa właściwości musi być wymaganym literałem ciągu dla wszystkich elementów członkowskich i uwzględnia wielkość liter. Wartości dyskryminowanej własności członków związku muszą być unikatowe w sposób niewrażliwy na wielkość liter.
type FooConfig = {
type: 'foo'
value: int
}
type BarConfig = {
type: 'bar'
value: bool
}
@discriminator('type')
param ServiceConfig FooConfig | BarConfig | { type: 'baz', *: string } = { type: 'bar', value: true }
Wartość parametru jest weryfikowana na podstawie wartości właściwości dyskryminowanej. Na przykład w poprzednim przykładzie, jeśli serviceConfig
parametr jest typu foo
, jest weryfikowany przy użyciu FooConfig
typu . Podobnie, jeśli parametr ma typ bar
, jest weryfikowany przy użyciu BarConfig
typu . Ten wzorzec dotyczy również innych typów.
Typ unii ma pewne ograniczenia:
Typy unii muszą być reducible do jednego typu usługi Azure Resource Manager. Następująca definicja jest nieprawidłowa:
type foo = 'a' | 1
Tylko literały są dozwolone jako elementy członkowskie.
Wszystkie literały muszą mieć ten sam typ danych pierwotnych (na przykład wszystkie ciągi lub wszystkie liczby całkowite).
Składnię typu unii można używać w typach danych zdefiniowanych przez użytkownika.
Zabezpieczanie ciągów i obiektów
Ciąg bezpieczny używa tego samego formatu co ciąg, a bezpieczny obiekt używa tego samego formatu co obiekt. Za pomocą elementu Bicep dodasz @secure()
dekorator do ciągu lub obiektu.
Po ustawieniu parametru na bezpieczny ciąg lub bezpieczny obiekt wartość parametru nie jest zapisywana w historii wdrożenia i nie jest rejestrowana. W przypadku ustawienia tej bezpiecznej wartości na właściwość, która nie oczekuje bezpiecznej wartości, wartość nie jest chroniona. Jeśli na przykład ustawisz bezpieczny ciąg na tag, ta wartość jest przechowywana jako zwykły tekst. Używaj bezpiecznych ciągów dla haseł i wpisów tajnych.
W poniższym przykładzie przedstawiono dwa bezpieczne parametry:
@secure()
param password string
@secure()
param configValues object
Możliwość przypisywania typów danych
W Bicep można przypisać wartość jednego typu (typu źródłowego) do innego typu (typ docelowy). W poniższej tabeli pokazano, który typ źródła (wymieniony w poziomie) można lub nie można przypisać do którego typu docelowego (wymienionego w pionie). W tabeli X oznacza możliwość przypisania, puste miejsce oznacza niemożliwą do przypisania i ? oznacza tylko wtedy, gdy typy są zgodne.
Typy | any |
error |
string |
number |
int |
bool |
null |
object |
array |
Nazwany zasób | Nazwany moduł | scope |
---|---|---|---|---|---|---|---|---|---|---|---|---|
any |
X | X | X | X | X | X | X | X | X | X | X | |
error |
||||||||||||
string |
X | X | ||||||||||
number |
X | X | X | |||||||||
int |
X | X | ||||||||||
bool |
X | X | ||||||||||
null |
X | X | ||||||||||
object |
X | X | ||||||||||
array |
X | X | ||||||||||
resource |
X | X | ||||||||||
module |
X | X | ||||||||||
scope |
? | |||||||||||
Nazwany zasób | X | ? | ? | |||||||||
Nazwany moduł | X | ? | ? |
Powiązana zawartość
Aby dowiedzieć się więcej o strukturze i składni Bicep, zobacz Bicep file structure (Struktura plików Bicep).