Определяемые пользователем типы данных в Bicep
Узнайте, как создать определяемые пользователем типы данных в Bicep. Сведения о системных типах данных см. в разделе "Типы данных". Использование определяемых пользователем типов данных автоматически включает создание кода версии 2.0 .
Определение типов
Инструкцию type
можно использовать для создания определяемых пользователем типов данных. Выражения типов также можно использовать в некоторых местах для определения пользовательских типов.
@<decorator>(<argument>)
type <user-defined-data-type-name> = <type-expression>
Декоратор @allowed
разрешен только для param
инструкций. Чтобы объявить тип с набором предопределенных значений в type
синтаксисе типа объединения.
Допустимые выражения типов включают:
Символьные ссылки — это идентификаторы, ссылающиеся на внешний тип (например
string
, илиint
) или символ определяемого пользователем типа, объявленный в инструкцииtype
:// Bicep data type reference type myStringType = string // user-defined type reference type myOtherStringType = myStringType
Примитивные литералы, включая строки, целые числа и логические выражения, являются допустимыми выражениями типов. Например:
// a string type with three allowed values. type myStringLiteralType = 'bicep' | 'arm' | 'azure' // an integer type with one allowed value type myIntLiteralType = 10 // an boolean type with one allowed value type myBoolLiteralType = true
Можно объявить типы массивов, добавляя к любому допустимому выражению
[]
типа:// A string type array type myStrStringsType1 = string[] // A string type array with three allowed values type myStrStringsType2 = ('a' | 'b' | 'c')[] type myIntArrayOfArraysType = int[][] // A mixed-type array with four allowed values type myMixedTypeArrayType = ('fizz' | 42 | {an: 'object'} | null)[]
Типы объектов содержат ноль или больше свойств между фигурными скобками:
type storageAccountConfigType = { name: string sku: string }
Каждое свойство в объекте состоит из ключа и значения, разделенного двоеточием
:
. Ключ может быть любой строкой, с неидентификаторными значениями, заключенными в кавычки. Значение может быть любым типом выражения.Свойства требуются, если они не имеют маркера необязательности
?
после значения свойства. Например,sku
свойство в следующем примере является необязательным:type storageAccountConfigType = { name: string sku: string? }
Вы можете использовать декораторы для свойств. Звездочка (
*
) можно использовать для выполнения всех значений, требующих ограничения. Вы можете определить дополнительные свойства с помощью*
. В этом примере создается объект, требующий ключа типаint
с именемid
. Все остальные записи в объекте должны быть строковым значением не менее 10 символов.type obj = { @description('The object ID') id: int @description('Additional properties') @minLength(10) *: string }
В следующем примере показано, как использовать синтаксис типа объединения для перечисления набора предопределенных значений:
type directions = 'east' | 'south' | 'west' | 'north' type obj = { level: 'bronze' | 'silver' | 'gold' }
Типы объектов могут использовать прямую или непрямую рекурсию, если по крайней мере путь к точке рекурсии является необязательным. Например, определение в следующем примере допустимо,
myObjectType
так как непосредственно рекурсивное свойство является необязательнымrecursiveProp
:type myObjectType = { stringProp: string recursiveProp: myObjectType? }
Следующее определение типа не будет допустимым, так как ни один из
level1
,level2
илиlevel3
level4
level5
необязательный.type invalidRecursiveObjectType = { level1: { level2: { level3: { level4: { level5: invalidRecursiveObjectType } } } } }
Можно использовать унарные операторы Bicep с целыми числами и логическими литералами или ссылками на целые или логические символы, типизированные литералами:
type negativeIntLiteral = -10 type negatedIntReference = -negativeIntLiteral type negatedBoolLiteral = !true type negatedBoolReference = !negatedBoolLiteral
Профсоюзы могут включать любое количество литеральных выражений. Типы объединения превратятся в ограничение разрешенного значения в Bicep, поэтому только литералы разрешены в качестве членов.
type oneOfSeveralObjects = {foo: 'bar'} | {fizz: 'buzz'} | {snap: 'crackle'} type mixedTypeArray = ('fizz' | 42 | {an: 'object'} | null)[]
Выражения типов можно использовать в type
инструкции, а также использовать выражения типов для создания определяемых пользователем типов данных, как показано в следующих местах:
В качестве предложения типа инструкции
param
. Например:param storageAccountConfig { name: string sku: string }
:
После свойства типа объекта. Например:param storageAccountConfig { name: string properties: { sku: string } } = { name: 'store$(uniqueString(resourceGroup().id)))' properties: { sku: 'Standard_LRS' } }
Перед выражением
[]
типа массива. Например:param mixedTypeArray ('fizz' | 42 | {an: 'object'} | null)[]
Типичный Bicep-файл для создания учетной записи хранения выглядит следующим образом:
param location string = resourceGroup().location
param storageAccountName string
@allowed([
'Standard_LRS'
'Standard_GRS'
])
param storageAccountSKU string = 'Standard_LRS'
resource storageAccount 'Microsoft.Storage/storageAccounts@2023-04-01' = {
name: storageAccountName
location: location
sku: {
name: storageAccountSKU
}
kind: 'StorageV2'
}
Определяемые пользователем типы данных могут выглядеть следующим образом:
param location string = resourceGroup().location
type storageAccountSkuType = 'Standard_LRS' | 'Standard_GRS'
type storageAccountConfigType = {
name: string
sku: storageAccountSkuType
}
param storageAccountConfig storageAccountConfigType
resource storageAccount 'Microsoft.Storage/storageAccounts@2023-04-01' = {
name: storageAccountConfig.name
location: location
sku: {
name: storageAccountConfig.sku
}
kind: 'StorageV2'
}
Использование декораторов
Декораторы записываются в формате @expression
и помещаются над объявлениями определяемого пользователем типа данных. В следующей таблице показаны доступные декораторы для определяемых пользователем типов данных.
Декоратор | Как применить | Аргумент | Description |
---|---|---|---|
описание | all | строка | Укажите описания для определяемого пользователем типа данных. |
дискриминатор | объект | строка | Используйте этот декоратор, чтобы убедиться, что правильный подкласс определен и управляется. |
Экспорт | all | ничего | Указывает, что определяемый пользователем тип данных доступен для импорта другим файлом Bicep. |
maxLength | Массив, строка | INT | Максимальная длина для типов данных строк и массива. Значение является инклюзивным. |
maxValue | INT | INT | Максимальное значение для целых типов данных. Это значение является инклюзивным. |
metadata | all | объект | Настраиваемые свойства для применения к типам данных. Может включать свойство описания, эквивалентное декоратору описания. |
minLength | Массив, строка | INT | Минимальная длина для типов данных строк и массива. Значение является инклюзивным. |
minValue | INT | INT | Минимальное значение для целочисленных типов данных. Это значение является инклюзивным. |
sealed | объект | ничего | Повышение уровня BCP089 от предупреждения до ошибки, когда имя свойства определяемого пользователем типа данных, скорее всего, является опечаткой. Дополнительные сведения см. в разделе "Повышение уровня ошибок". |
secure | Строка, объект | ничего | Помечает типы как безопасные. Значение безопасного типа не сохраняется в журнале развертывания и не регистрируется. Дополнительные сведения см. в разделе Защита строк и объектов. |
Декораторы находятся в пространстве имен sys. Если вам важно, чтобы декоратор не путался с другими элементами с таким же именем, добавьте к нему префикс sys
. Например, если файл Bicep содержит переменную с именем description
, необходимо добавить sys
пространство имен при использовании description
декоратора.
Дискриминатор
См . раздел "Тип данных объединения с тегами".
Description
Добавьте описание в определяемый пользователем тип данных. Вы можете использовать декораторы для свойств. Например:
@description('Define a new object type.')
type obj = {
@description('The object ID')
id: int
@description('Additional properties')
@minLength(10)
*: string
}
Текст описания можно использовать в формате Markdown.
Экспорт (Export)
Используется @export()
для совместного использования определяемого пользователем типа данных с другими файлами Bicep. Дополнительные сведения см. в разделе "Экспорт переменных", "типы" и "Функции".
Ограничения для целочисленных параметров
Можно задать минимальные и максимальные значения для целочисленного типа. Вы можете установить один или оба этих предела.
@minValue(1)
@maxValue(12)
type month int
Ограничения длины
Можно указать минимальную и максимальную длину для типов строк и массивов. Вы можете установить один или оба этих предела. Для строк длина указывает количество символов. Для массивов она указывает количество элементов.
В следующем примере объявляется два типа. Один тип — это имя учетной записи хранения, которое должно содержать от 3 до 24 символов. Другой тип — это массив, который должен иметь от одного до пяти элементов.
@minLength(3)
@maxLength(24)
type storageAccountName string
@minLength(1)
@maxLength(5)
type appNames array
Метаданные
Если у вас есть настраиваемые свойства, которые необходимо применить к определяемой пользователем типу данных, добавьте декоратор метаданных. В метаданных определите объект с настраиваемыми именами и значениями. Объект, заданный для метаданных, может содержать свойства с любым именем и типом.
Этот декоратор может использоваться для отслеживания сведений о типе данных, который не имеет смысла добавить в описание.
@description('Configuration values that are applied when the application starts.')
@metadata({
source: 'database'
contact: 'Web team'
})
type settings object
Когда вы предоставляете декоратор с свойством @metadata()
, который конфликтует с другим декоратором, этот декоратор всегда имеет приоритет над всем в декораторе @metadata()
. Таким образом, конфликтующее свойство в @metadata()
значении является избыточным и заменено. Дополнительные сведения см. в разделе "Нет конфликтующих метаданных".
Запечатанный
См. сведения об уровне ошибок с повышенными привилегиями.
Безопасные типы
Вы можете пометить тип данных, определенный пользователем строкой или объектом, как безопасный. Значение безопасного типа не сохраняется в журнале развертывания и не регистрируется.
@secure()
type demoPassword string
@secure()
type demoSecretObject object
Повышение уровня ошибок
По умолчанию объявление типа объекта в Bicep позволяет принимать больше свойств любого типа. Например, следующий Bicep действителен, но вызывает предупреждение [BCP089]: The property "otionalProperty" is not allowed on objects of type "{ property: string, optionalProperty: null | string }". Did you mean "optionalProperty"?
type anObject = {
property: string
optionalProperty: string?
}
param aParameter anObject = {
property: 'value'
otionalProperty: 'value'
}
Предупреждение сообщает о том, что anObject
тип не содержит свойства с именем otionalProperty
. Хотя во время развертывания ошибки не возникают, компилятор Bicep предполагает, что otionalProperty
это опечатка, и что вы намеревались использовать optionalProperty
, но неправильно ее использовать. Bicep оповещает вас о несоответствии.
Чтобы передать эти предупреждения в ошибки, примените @sealed()
декоратор к типу объекта:
@sealed()
type anObject = {
property: string
optionalProperty?: string
}
Вы получаете те же результаты, применяя @sealed()
декоратор к param
объявлению:
type anObject = {
property: string
optionalProperty: string?
}
@sealed()
param aParameter anObject = {
property: 'value'
otionalProperty: 'value'
}
Модуль развертывания Azure Resource Manager также проверяет запечатанные типы для других свойств. Предоставление дополнительных свойств для запечатанных параметров приводит к ошибке проверки, что приводит к сбою развертывания. Например:
@sealed()
type anObject = {
property: string
}
param aParameter anObject = {
property: 'value'
optionalProperty: 'value'
}
Тип данных объединения с тегами
Чтобы объявить настраиваемый тип данных объединения тегами в файле Bicep, можно разместить discriminator
декоратор над объявлением определяемого пользователем типа. Для использования этого декоратора требуется интерфейс командной строки Bicep версии 0.21.X или более поздней . В следующем примере показано, как объявить тип данных объединения с тегами:
type FooConfig = {
type: 'foo'
value: int
}
type BarConfig = {
type: 'bar'
value: bool
}
@discriminator('type')
type ServiceConfig = FooConfig | BarConfig | { type: 'baz', *: string }
param serviceConfig ServiceConfig = { type: 'bar', value: true }
output config object = serviceConfig
Дополнительные сведения см. в разделе "Пользовательский тип данных объединения с тегами".
Связанный контент
Список типов данных Bicep см. в разделе "Типы данных".