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:

Red Air Nike 9 Kid's Max Big Black GS Leather Shoe White University Kids alias RecArray = Array(Int32) | Array(RecArray)

ary = [] of RecArray
ary.push [Shoe Red Big Kids Black University GS Air Leather Max Nike Kid's 9 White 1, 2, 3]
ary.push ary
ary #=> [[1, 2, 3], [...]]Nike Blue Basketball University Lebron gym Low Gold Photo Men's Blue Shoe XII rqTwrI

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