Поделиться через


Типы данных в 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 поддерживает целый литеральный тип, который ссылается на определенное значение, которое является точным целым числом. В следующем примере 1 является целым литеральным типом, foo может быть назначено только значение 1 , а другое значение отсутствует.

output foo 1 = 1

Целочисленный литеральный тип может быть объявлен встроенным, как показано в предыдущем примере или в оператореtype.

type oneType = 1

output foo oneType = 1
output bar oneType = 2

В предыдущем примере при назначении 2 линейчатой ошибки BCP033 ожидается значение типа "1", но указанное значение имеет тип "2".

В следующем примере показано использование целочисленного литерала с типом объединения:

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

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

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

output redColor 'red' = 'red'

Строковый литеральный тип может быть объявлен встроенным, как показано в предыдущем примере или в инструкцииtype.

type redColor = 'red'

output colorRed redColor = 'red'
output colorBlue redColor = 'blue'

В предыдущем примере при назначении синего цвета в colorBlue возникает ошибка BCP033. Ожидается значение типа "red", но указанное значение имеет тип "blue".

В следующем примере показано использование строкового литерала с типом объединения:

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 тип объединения позволяет создать объединенный тип, состоящий из набора подтипов. Назначение допустимо, если разрешено одно из отдельных назначений подтипов. Символ | отделяет отдельные подтипы с помощью или условия. Например, синтаксис "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)[]

Объединения типов должны быть редуцируемыми к одному типу ARM, например 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 . Аналогичным образом, если параметр имеет строку типа, он проверяется с помощью типа BarConfig. Этот шаблон также применяется к другим типам.

Существуют некоторые ограничения с типом объединения.

  • Типы объединения должны быть редуцируемыми к одному типу Azure Resource Manager (ARM). Недопустимое определение:

    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 см. в этом разделе.