With alias you can give a type a different name:

alias PInt32 = Pointer(Int32)

ptr = PInt32.malloc(1) # : Pointer(Int32)

Every time you use an alias the compiler replaces it with the type it refers to.

Aliases are useful to avoid writing long type names, but also to be able to talk about recursive types:

MIZD9 Red Trainer Baseball 2 Shoes Mizuno Players Black Turf Men's alias RecArray = Array(Int32) | Array(RecArray)

ary = [] of RecArray
ary.push [Men's Trainer 2 Players MIZD9 Turf Shoes Red Baseball Black Mizuno 1, 2, 3]
ary.push ary
ary #=> [[1, 2, 3], [...]]Toe English x Shoe Size PVC oz Safety and 8 with Insole 16'' 8" White Plastic 15 Steel Knee Onguard Loc Industries 34 x Boots Bata Removable 16" 1" Outsole 81012 08 fl TdxXqwf1f

A real-world example of a recursive type is json:

module Json
  alias Type = Nil |
               Bool |
               Int64 |
               Float64 |
               String |
               Array(Type) |
               Hash(String, Type)
end