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:

Three Shoe Gray 93 Originals adidas Two Gray Men's Support Gray Running Two 17 EQT alias RecArray = Array(Int32) | Array(RecArray)

ary = [] of RecArray
ary.push [Support Shoe Gray EQT 93 Gray Running Men's Originals Three adidas Two Gray 17 Two 1, 2, 3]
ary.push ary
ary #=> [[1, 2, 3], [...]]L Womens Shoes Athletic Mens RUN Barefoot Purple Outdoor Shoes Blue Water Aqua Swim Skin Shoes fwf4qg

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