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:

Men's NIKE Red Shoe Running tough Black Free Hydrogen RN Blue alias RecArray = Array(Int32) | Array(RecArray)

ary = [] of RecArray
ary.push [NIKE Men's Hydrogen Blue Shoe Red Running Black RN tough Free 1, 2, 3]
ary.push ary
ary #=> [[1, 2, 3], [...]]Open Shoes Leather Flexible Strap Women's Comfortable Width Toe Casual Summer Wide Black Ankle Sandals Flat w4q7CX

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