Типы данных в Bicep

В этой статье описаны типы данных, доступные в 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

Логические значения

При указании логических значений используйте true или false. Не заключайте значение в кавычки.

param exampleBool bool = true

Целые числа

При указании целочисленных значений не используйте кавычки.

param exampleInt int = 1

В Bicep используются 64-разрядные целые числа. Для целых чисел, переданных в качестве встроенных параметров, диапазон значений может быть ограничен пакетом SDK или средством командной строки, используемым для развертывания. Например, при использовании PowerShell для развертывания Bicep типы целых чисел могут находиться в диапазоне от –2147483648 до 2147483647. Чтобы избежать этого ограничения, укажите большие целочисленные значения в файле параметров. Типы ресурсов применяют собственные ограничения для свойств целочисленных значений.

Двоичный формат, а также форматы числа с плавающей запятой и десятичного числа сейчас не поддерживаются.

Объект

Объекты начинаются с левой фигурной скобки ({) и заканчиваются правой фигурной скобкой (}). В 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

Методы доступа к свойствам можно использовать с любым объектом, включая параметры и переменные типов и литералов объектов. Использование метода доступа к свойству для выражения типа, не являющегося объектом, является ошибкой.

Вы также можете использовать синтаксис [] для доступа к свойству. В приведенном ниже примере возвращается 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

Строки

В Bicep строки помечаются одинарными кавычками и должны быть объявлены в одной строке. Разрешены все символы Юникода с кодовыми точками, находящимися в диапазоне между 0 и 10FFFF.

param exampleString string = 'test value'

В следующей таблице приведен набор зарезервированных символов, которые должны быть экранированы символом обратной косой черты (\):

Escape-последовательность Представленное значение Примечания.
\\ \
\' '
\n перевод строки
\r возврат каретки
\t знак табуляции
\u{x} кодовая точка Юникода x x представляет значение шестнадцатеричной кодовой точки в диапазоне от 0 до 10FFFF включительно. Нули в начале разрешены. Кодовые точки со значениями больше FFFF создаются в качестве суррогатной пары.
\$ $ Escape-последовательность выполняется, только если после нее стоит символ {.
// evaluates to "what's up?"
var myVar = 'what\'s up?'

Все строки в 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 вы добавляете @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 см. в этом разделе.