Типы данных в Bicep
В этой статье описываются типы данных, поддерживаемые в Bicep. Сведения о определении пользовательских типов данных см. в разделе "Определяемые пользователем типы данных".
Массивы
Массивы начинаются с левой квадратной скобки ([
) и заканчиваются правой квадратной скобкой (]
). В Bicep можно объявить массив в одной строке или в нескольких строках. Запятые (,
) используются между значениями в однострочных объявлениях, но они не используются в объявлениях с несколькими строками. Вы можете смешивать и сопоставлять однострочные и многострочные объявления. Для объявления с несколькими строками требуется Bicep CLI версии 0.7.X или более поздней.
var multiLineArray = [
'abc'
'def'
'ghi'
]
var singleLineArray = ['abc', 'def', 'ghi']
var mixedArray = ['abc', 'def'
'ghi']
Каждый элемент массива может иметь любой тип. Можно использовать массив, в котором каждый элемент относится к одному и тому же типу данных, или массив, содержащий различные типы данных.
В следующем примере показан массив целых чисел и массив различных типов.
var integerArray = [
1
2
3
]
var mixedArray = [
resourceGroup().name
1
true
'example string'
]
Массивы в Bicep основаны на нуле. В следующем примере выражение exampleArray[0]
принимает значение 1, а exampleArray[2]
— 3. Индекс индексатора может быть другим выражением. Выражение exampleArray[index]
принимает значение 2. Целые индексаторы разрешены только для выражения типов массивов.
var index = 1
var exampleArray = [
1
2
3
]
При выходе индекса из пределов возникает следующая ошибка:
The language expression property array index 'x' is out of bounds
Чтобы избежать этого исключения, используйте логический оператор Or, как показано в следующем примере:
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
Операторы, связанные с массивом
- Используйте операторы сравнения для сравнения двух массивов.
- Используйте метод доступа к индексу , чтобы получить элемент из массива.
- Используйте оператор safe-dereference для доступа к элементам массива.
- Используйте распространение для объединения массивов.
Функции, связанные с массивом
- См. статью "Функции массива".
- См . лямбда-функции.
Логические значения
При указании логических значений используйте true
или false
. Не заключайте значение в кавычки.
param exampleBool bool = true
Логические операторы
- Используйте операторы сравнения для сравнения логических значений.
- См . логические операторы.
Логические функции
Целые числа
При указании целых значений не используйте кавычки.
param exampleInt int = 1
Целые числа Bicep — это 64-разрядные целые числа. При передаче в качестве встроенных параметров пакет SDK или средство командной строки, используемое для развертывания, может ограничить диапазон значений. Например, при использовании PowerShell для развертывания Bicep целые типы могут варьироваться от -2147483648 до 2147483647. Чтобы избежать этого ограничения, укажите большие целые значения в файле параметров. Типы ресурсов применяют собственные ограничения для свойств целочисленных значений.
Bicep поддерживает целочисленный литеральный тип, который ссылается на определенное значение, которое является точным целым числом. В следующем примере 1
является целым литеральным типом и foo
может быть назначено только значение 1
и никакое другое значение.
output foo 1 = 1
Можно объявить целый литерал либо встроенный тип, как показано в предыдущем примере, либо в инструкцииtype
.
type oneType = 1
output foo oneType = 1
output bar oneType = 2
В предыдущем примере при назначении результатов ошибки BCP033: "Ожидается значение типа1
, но указанное значение имеет тип2
".2
bar
В следующем примере используется целый литеральный тип с типом объединения:
output bar 1 | 2 | 3 = 3
В настоящее время плавающая точка, десятичные или двоичные форматы не поддерживаются.
Операторы, связанные с целым числом
- См . операторы сравнения.
- См . числовые операторы.
Функции, связанные с целым числом
Объект
Объекты начинаются с левой фигурной скобки ({
) и заканчиваются правой фигурной скобкой (}
). В Bicep можно объявить объект в одной строке или в нескольких строках. Каждое свойство в объекте состоит из ключа и значения. Ключ и значение разделяются двоеточием (:
). Объект разрешает любое свойство любого типа. Запятые (,
) используются между свойствами для однострочных объявлений, но они не используются между свойствами для объявлений с несколькими строками. Вы можете смешивать и сопоставлять однострочные и многострочные объявления. Для объявления с несколькими строками требуется Bicep CLI версии 0.7.X или более поздней.
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}
В Bicep кавычки при необходимости допускаются для ключей свойств объекта:
var test = {
'my - special. key': 'value'
}
В предыдущем примере кавычки используются, когда ключи свойств объекта содержат специальные символы. Примерами являются пробелы или -
.
. В следующем примере показано, как использовать интерполяцию в ключах свойств объекта.
var stringVar = 'example value'
var objectVar = {
'${stringVar}': 'this value'
}
Для доступа к свойствам объекта используются методы доступа к свойствам. Они создаются с помощью .
оператора.
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
С любым объектом можно использовать методы доступа к свойствам, включая параметры и переменные типов объектов и литералы объектов. Метод доступа к свойствам, используемый для выражения типа неobject, является ошибкой.
Вы также можете использовать синтаксис []
для доступа к свойству. В приведенном ниже примере возвращается Development
.
var environmentSettings = {
dev: {
name: 'Development'
}
prod: {
name: 'Production'
}
}
output accessorResult string = environmentSettings['dev'].name
В ФОРМАТЕ JSON объект является неупорядоченной коллекцией нулевых или более пар ключей или значений. Порядок может отличаться в зависимости от реализаций. Например, функция Bicep items() сортирует объекты в алфавитном порядке. В других местах можно сохранить исходное упорядочение. Из-за этого недетерминированного, избегайте принятия каких-либо предположений о упорядочении ключей объектов при написании кода, который взаимодействует с параметрами развертывания и выходными данными.
При доступе к неисключаемом свойству объекта возникает следующая ошибка:
The language expression property 'foo' doesn't exist
Чтобы избежать исключения, можно использовать логический оператор And, как показано в следующем примере:
param objectToTest object = {
one: 1
two: 2
three: 3
}
output bar bool = contains(objectToTest, 'four') && objectToTest.four == 4
Операторы, связанные с объектами
- Используйте операторы сравнения для сравнения объектов.
- Используйте метод доступа к индексу, чтобы получить свойство из объекта.
- Используйте оператор safe-dereference для доступа к членам объекта.
- Используйте распространение для слияния объектов.
Функции, связанные с объектами
См . функции объектов.
Строки
В Bicep строки помечаются одними кавычками, и их необходимо объявить в одной строке. Все символы Юникода с точками кода между 0
и 10FFFF
разрешены.
param exampleString string = 'test value'
В следующей таблице перечислены набор зарезервированных символов, которые необходимо экранировать с помощью символа обратной косой черты (\
).
escape-последовательность | Представленное значение | Примечания. |
---|---|---|
\\ |
\ |
|
\' |
' |
|
\n |
Канал строк (LF) | |
\r |
Возврат каретки (CR) | |
\t |
Символ табуляции | |
\u{x} |
кодовая точка Юникода x |
Представляет x шестнадцатеричное значение точки кода между 0 и 10FFFF (оба включительно). Нули в начале разрешены. Приведенные выше FFFF кодовые точки создаются как суррогатная пара. |
\$ |
$ |
Escape-последовательность выполняется, только если после нее стоит символ { . |
// evaluates to "what's up?"
var myVar = 'what\'s up?'
Bicep поддерживает строковый литеральный тип, ссылающийся на определенное строковое значение. В следующем примере red
используется строковый литерал. Значение можно назначить red
redColor
только .
output redColor 'red' = 'red'
Можно объявить строковый литерал либо встроенный тип, как показано в предыдущем примере, либо в инструкцииtype
.
type redColor = 'red'
output colorRed redColor = 'red'
output colorBlue redColor = 'blue'
В предыдущем примере при назначении результатов ошибки BCP033: "Ожидается значение типаred
, но указанное значение имеет типblue
".blue
colorBlue
В следующем примере показан строковый литеральный тип, используемый с типом объединения:
type direction = 'north' | 'south' | 'east' | 'west'
output west direction = 'west'
output northWest direction = 'northwest'
Все строки в Bicep поддерживают интерполяцию. Чтобы внедрить выражение, перед ним введите ${
, а после — }
. Выражения, на которые указывают ссылки, не могут охватывать несколько строк.
var storageName = 'storage${uniqueString(resourceGroup().id)}'
Многострочные строки
В Bicep многострочные строки определяются между тремя одними кавычками ('''
) и при необходимости новой строкой (открывающей последовательностью) и тремя одними кавычками ('''
является закрывающей последовательностью). Символы, введенные между открывающей и закрывающей последовательностью, считываются подробно. Экранирование невозможно или невозможно.
Примечание.
Средство синтаксического анализа Bicep считывает все символы как есть. В зависимости от конец строки файла Bicep новые линии интерпретируются как \r\n
или\n
.
Интерполяция в настоящее время не поддерживается в нескольких строках. Из-за этого ограничения может потребоваться использовать concat
функцию вместо интерполяции.
Строки с несколькими строками, которые содержатся '''
, не поддерживаются.
// 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}'''
Операторы, связанные со строками
- См . операторы сравнения.
Функции, связанные со строками
Типы объединения
В Bicep тип объединения позволяет создать объединенный тип, состоящий из набора подтипов. Назначение допустимо, если разрешено одно из отдельных назначений подтипов. Символ |
разделяет отдельные подтипы, использующие or
условие. Например, синтаксис a | b
означает, что допустимое назначение может быть либо a
либо b
. Типы объединения превратятся в ограничение разрешенного значения в Bicep, поэтому только литералы разрешены в качестве членов. Профсоюзы могут включать любое количество литеральных выражений.
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)[]
Объединения типов должны быть редуцируемыми для одного типа Azure Resource Manager, например string
int
, или bool
. В противном случае вы получите код ошибки BCP294 . Например:
type foo = 'a' | 1
Любое выражение типа можно использовать в качестве подтипа в объявлении типа объединения (между |
символами). Например, все допустимые примеры:
type foo = 1 | 2
type bar = foo | 3
type baz = bar | (4 | 5) | 6
Пользовательский тип данных объединения с тегами
Bicep поддерживает пользовательский тип данных объединения с тегами, который используется для представления значения, которое может быть одним из нескольких типов. Чтобы объявить тип данных с пользовательским тегом объединения, можно использовать @discriminator()
декоратор. Для использования этого декоратора требуется интерфейс командной строки Bicep версии 0.21.X или более поздней . Синтаксис:
@discriminator('<property-name>')
Дискриминационный декоратор принимает один параметр, который представляет имя общей собственности среди всех членов профсоюза. Это имя свойства должно быть обязательным строковым литералом для всех элементов и учитывает регистр. Значения дискриминированного свойства членов профсоюза должны быть уникальными в нечувствительной манере.
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 }
Значение параметра проверяется на основе значения дискриминации свойства. Например, в предыдущем примере, если serviceConfig
параметр имеет тип foo
, он проверяется с помощью FooConfig
типа. Аналогичным образом, если параметр имеет тип bar
, он проверяется с помощью BarConfig
типа. Этот шаблон также применяется к другим типам.
Тип объединения имеет некоторые ограничения:
Типы объединения должны быть редуцируемыми для одного типа Azure Resource Manager. Недопустимое определение:
type foo = 'a' | 1
Только литералы разрешены в качестве членов.
Все литералы должны иметь один и тот же примитивный тип данных (например, все строки или все целые числа).
Синтаксис типа объединения можно использовать в определяемых пользователем типах данных.
Защищенные строки и объекты
Защищенная строка использует тот же формат, что и строка, а защищенный объект использует тот же формат, что и объект. При использовании Bicep вы добавляете @secure()
декоратор в строку или объект.
Если для параметра задана защищенная строка или защищенный объект, значение параметра не сохраняется в журнале развертывания и не регистрируется. Если для этого безопасного значения задано свойство, которое не ожидает безопасного значения, это значение не защищено. Например, если для защищенной строки задан тег, это значение сохраняется как обычный текст. Используйте защищенные строки для паролей и секретов.
Ниже представлены примеры параметров.
@secure()
param password string
@secure()
param configValues object
Назначение типов данных
В Bicep можно назначить значение одного типа (исходного типа) другому типу (целевому типу). В следующей таблице показано, какой тип источника (указан горизонтально) можно или не удается назначить целевому типу (в списке по вертикали). В таблице X означает возможность назначения, пустое пространство означает недопустимое назначение и ? означает только в том случае, если типы совместимы.
Типы | any |
error |
string |
number |
int |
bool |
null |
object |
array |
Именованный ресурс | Именованный модуль | 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 |
? | |||||||||||
Именованный ресурс | X | ? | ? | |||||||||
Именованный модуль | X | ? | ? |
Связанный контент
Дополнительные сведения о структуре и синтаксисе Bicep см. в этом разделе.