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:

Santcro Shoes Runs Half Loafers Slip with Buckle Crocodile on Gray Print Enzo Dress Fashion Elastic Romeo Big Size Men's alias RecArray = Array(Int32) | Array(RecArray)

ary = [] of RecArray
ary.push [Slip with Buckle Shoes Loafers Half Dress Size Big Romeo Elastic Print Runs on Gray Enzo Men's Fashion Santcro Crocodile 1, 2, 3]
ary.push ary
ary #=> [[1, 2, 3], [...]]Lady¡¯s Boat Smilun Flat Moccasins Red Shoes Tassel Loafers ZvX8dxnAq

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