Share via


Bicep のユーザー定義データ型

Bicep でユーザー定義データ型を使用する方法について説明します。

この機能を使用するには、Bicep CLI バージョン 0.12.X 以上が必要です。

ユーザー定義データ型の構文

ユーザー定義データ型を定義するには、type ステートメントを使用できます。 また、一部の場所で型式を使用してカスタム型を定義することもできます。

type <user-defined-data-type-name> = <type-expression>

Note

@allowed デコレーターは、param ステートメントでのみ許可されています。 type または output ステートメントでプロパティが定義済みの値のいずれかのセットでなければならないことを宣言するには、共用体型の構文を使用します。 共用体型の構文は、param ステートメントでも使用できます。

有効な型式は次のとおりです。

  • シンボリック参照は、"アンビエント" 型 (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)[]
    
  • オブジェクト型には、中かっこの間に 0 個以上のプロパティが含まれます。

    type storageAccountConfigType = {
      name: string
      sku: string
    }
    

    オブジェクト内の各プロパティはキーと値で構成されます。 キーと値はコロン (:) で区切られます。 キーには任意の文字列を指定できます (有効な識別子ではない値は引用符で囲む必要があります)。また、値には任意の型の構文式を指定できます。

    プロパティ値の後に省略可能のマーカー (?) がない限り、プロパティは必須です。 たとえば、次の例の sku プロパティは省略可能です。

    type storageAccountConfigType = {
      name: string
      sku: string?
    }
    

    プロパティではデコレーターを使用できます。 * は、すべての値で制約が必要とするために使用することができます。 * を使用する場合でも、追加のプロパティを定義できます。 この例では、id という名前の int 型のキーを必要とするオブジェクトを作成します。オブジェクト内の他のすべてのエントリは、10 文字以上の長さの文字列値である必要があります。

    type obj = {
      @description('The object ID')
      id: int
    
      @description('Additional properties')
      @minLength(10)
      *: string
    }
    

    次の例は、共用体型の構文を使用して、定義済みの値のセットを一覧表示する方法を示しています。

    type obj = {
      level: 'bronze' | 'silver' | 'gold'
    }
    

    再帰

    オブジェクト型では、少なくとも再帰ポイントへのパスの区間が省略可能である限り、直接または間接再帰を使用できます。 たとえば、次の例の myObjectType 定義は、直接再帰の recursiveProp プロパティが省略可能であるため有効です。

    type myObjectType = {
      stringProp: string
      recursiveProp: myObjectType?
    }
    

    ただし、次の型定義は、level1level2level3level4、または 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 ステートメントの type 句として。 次に例を示します。

    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@2022-09-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@2022-09-01' = {
  name: storageAccountConfig.name
  location: location
  sku: {
    name: storageAccountConfig.sku
  }
  kind: 'StorageV2'
}

タグ付き共用体型を宣言する

Bicep ファイル内でカスタム タグ付き共用体データ型を宣言するには、ユーザー定義型宣言の上に識別子デコレーターを配置します。 このデコレータを使用するには、Bicep CLI バージョン 0.21.X 以上が必要です。 構文は次のとおりです。

@discriminator('<propertyName>')

識別子デコレーターは、1 つのパラメーターを受け取り、これはすべての共用体メンバーにわたって共有されるプロパティ名を表します。 このプロパティ名は、すべてのメンバーで要求される文字列リテラルである必要があり、大文字と小文字が区別されます。 共用体メンバーの判別プロパティの値は、大文字と小文字を区別しない方法で一意である必要があります。

次の例は、タグ付けされた共用体型を宣言する方法を示しています。

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

パラメーター値は、判別プロパティ値に基づいて検証されます。 前の例では、serviceConfig パラメーターの値が foo 型である場合、FooConfig 型を使った検証が行われます。 同様に、パラメーター値が bar 型である場合、検証は BarConfig 型を使用して実行され、このパターンは他の型でも同様に適用されます。

Bicep ファイル間で型をインポートする (プレビュー)

このコンパイル時インポート機能を使用するには、Bicep CLI バージョン 0.21.X 以上が必要です。 実験用フラグ compileTimeImports は、Bicep 構成ファイルから有効にする必要があります。

他のテンプレートにインポートできるのは、@export() デコレーターを持つユーザー定義データ型のみです。 現時点では、このデコレーターは type ステートメント上でのみ使用できます。

次の例では、他のテンプレートから 2 つのユーザー定義データ型をインポートできます。

@export()
type myStringType = string

@export()
type myOtherStringType = myStringType

詳細については、「ユーザー定義データ型のインポート」を参照してください。

次のステップ

  • Bicep のデータ型一覧については、データ型に関するページを参照してください。