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:

Grey Kaymin Balance New Trail Trail White Running Shoe Fresh v1 Men's Foam alias RecArray = Array(Int32) | Array(RecArray)

ary = [] of RecArray
ary.push [White Foam Trail Men's Balance Grey New Fresh Shoe v1 Kaymin Running Trail 1, 2, 3]
ary.push ary
ary #=> [[1, 2, 3], [...]]Sandal Toe Gray Open Gym Soft Slippers Bathroom Slippers House Slippers Quick Shower Slippers Sole Drying dYgvPq6dxw

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