Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье описываются типы данных, поддерживаемые в Bicep. Сведения о определении пользовательских типов данных см. в разделе "Определяемые пользователем типы данных".
Любое
При использовании Bicep версии 0.38.3 и более поздних версий тип в Bicep является недопустимым типом, any который отключает проверку типа во время компиляции для связанного символа. Значение типа any может содержать данные любого типа, включая string, , int, boolили arrayobjectсложные выражения.
param foo any
output bar any = foo
В предыдущем примере foo может принимать любой тип значения и bar выводить то же значение, что foo и независимо от его типа.
Так как any безопасность типов Bicep пропускает его, его следует использовать только в том случае, если точный тип не может быть определен заранее. Например, при передаче данных через модуль, обрабатывающий несколько фигур данных или при работе с нетипизированными входными данными JSON.
Использование any делает Bicep менее предсказуемым и может привести к ошибкам среды выполнения. По возможности предпочитайте определенные типы или объединение ожидаемых типов для сохранения поддержки проверки и IntelliSense.
Явное правило linter позволяет определить и запретить использование any типа в файлах Bicep.
Массивы
Массив в Bicep — это упорядоченная коллекция значений, например строк, целых чисел, объектов или даже других массивов, часто используемых для группировки связанных элементов, таких как имена ресурсов, параметры конфигурации или параметры. Массивы полезны для организации данных развертывания, передачи списков в ресурсы и итерации по нескольким значениям.
Массивы в Bicep неизменяемы. После объявления их содержимое не может быть изменено. Чтобы изменить массив, создайте новый массив с помощью таких функций, как concat, mapили filter.
Вы можете объявить массивы в Bicep с помощью однострочного или многострочного синтаксиса. Для объявлений многострочный массив требуется интерфейс командной строки Bicep версии 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'
]
var arrayOfObjects = [
{ name: 'dev', size: 1 }
{ name: 'prod', size: 2 }
]
В Bicep используются массивы с нулевой базой. Доступ к элементам можно получить по индексу:
var exampleArray = [1, 2, 3]
output firstElement int = exampleArray[0] // 1
output thirdElement int = exampleArray[2] // 3
var index = 1
output secondElement int = exampleArray[index] // 2
Начиная с интерфейса командной строки Bicep версии 0.34.x, можно использовать array[^index] синтаксис для доступа к элементам из конца массива — ^1 относится к последнему элементу, ^2 второму и последнему и т. д.
var exampleArray = [1, 2, 3]
output lastElement int = exampleArray[^1] // 3
output secondToLastElement int = exampleArray[^2] // 2
При доступе к индексу, который выходит за пределы, возникает ошибка:
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: "Ожидается значение типа2, но указанное значение имеет типbar".12
В следующем примере используется целый литеральный тип с типом объединения:
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 используется строковый литерал. Значение можно назначить redredColorтолько .
output redColor 'red' = 'red'
Можно объявить строковый литерал либо встроенный тип, как показано в предыдущем примере, либо в инструкцииtype.
type redColor = 'red'
output colorRed redColor = 'red'
output colorBlue redColor = 'blue'
В предыдущем примере при назначении результатов ошибки BCP033: "Ожидается значение типаblue, но указанное значение имеет типcolorBlue".redblue
В следующем примере показан строковый литеральный тип, используемый с типом объединения:
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, например stringint, или 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Только литералы разрешены в качестве членов.
Все литералы должны иметь один и тот же примитивный тип данных (например, все строки или все целые числа).
Синтаксис типа объединения можно использовать в определяемых пользователем типах данных.
Типы, допускающие значения NULL
Можно сделать любой примитивный или сложный тип пустым, добавив ? его к имени типа. Это позволяет параметру, переменной или выходным данным принимать значение NULL в качестве допустимого значения. Например:
output description string? = null
output config object? = null
output optionalValue int? = null
Защищенные строки и объекты
Безопасные строки используют тот же формат, что и строка, и безопасные объекты используют тот же формат, что и объект. При использовании 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 см. в разделе "Структура и синтаксис Bicep".