# Script.Options

Script types can be assigned options using the `with` keyword.

## With Keyword

The `with` keyword assigns arbitrary metadata directly to a type.

    const Email = Type.Script(`string with { format: 'email' }`)

    // Produces

    const Email = { type: 'string', format: 'email' }

The same syntax extends to multiple embedded types within a single declaration.

    const Vector = Type.Script(`{
      x: number with { minimum: 0, maximum: 1 },
      y: number with { minimum: 0, maximum: 1 },
      z: number with { minimum: 0, maximum: 1 },
    } with { additionalProperties: false }`)

It works equally well within computed type expressions, such as mapped types.

    const { Vector, ClampedVector } = Type.Script(`
      type Vector = {
        x: number
        y: number
        z: number
      }

      type Clamp<T> = {
        [K in keyof T]: T[K] with { minimum: 0, maximum: 1 }
      } with { additionalProperties: false }

      type ClampedVector = Clamp<Vector>
    `)

## With Function

The `with` keyword is a syntactic alias for the `With` function.

    const Email = Type.With(Type.String(), { format: 'email' })