Skip to content


Arrays are defined with square brackets [] and may contain one type of data:

Supported Types

Examples of valid arrays

[1, -2, 3_456] // array of numbers, mind the spaces  ✅
['foo', "bar"] // array of strings  ✅
[true, true, false, true] // array of bools  ✅
[@/file.joe, @/another/file.joe] // array of paths  ✅
[/[a-z]/i, /[0-9]/g] // array of regexes  ✅
[<"foo", 3.14, false>, <'bar', 900, true>] // array of tuples of shape <string, number, bool>  ✅
[{a: 4, b: 'c'}] // array of objects of shape {a: number, b: string}  ✅

Assigning to a variable

When assigning to a variable, if the array has at least one item in it, joelang can infer the underlying type. On the other hand when assigning an empty array, the type must be specified.

// infer type is number[]
const numbers = [1, 2];  ✅

// invalid since there are mixed types
const numbers = [1, '2'];  ❌

// instantiating an empty array
let myArray: bool[] = [];  ✅

Conditional items

One of the frustrations developers face is conditionally adding an item to an array. joelang has an easy syntax for that:

[1, 2 if condition, 3]

If condition is true, the array with be [1, 2, 3]. If condition is false, the array with be [1, 3]

Nesting arrays

Nesting arrays of the same type

Arrays can be nested, provided they are of the same type. In this example chess game, several Piece type arrays can together form a 2-dimensional array.

const chess: Piece[][] = [];

Nesting arrays of different types should use a tuple

A string[] array and a number[] array cannot be in the same outer array. For that, you can use a tuple

const someOtherGame: <string[], number[], bool[]> = <[1, 2], ['foo', 'bar'], [true, true]>;