# Aliasing

The `type` statement can be used to give a new name to an existing type. Types must have `UpperCamelCase` names, or the compiler will raise a warning. The exception to this rule are the primitive types: `usize`, `f32`, etc.

    // `NanoSecond` is a new name for `u64`.
    type NanoSecond = u64;
    type Inch = u64;

    // Use an attribute to silence warning.
    #[allow(non_camel_case_types)]
    type u64_t = u64;
    // TODO ^ Try removing the attribute

    fn main() {
        // `NanoSecond` = `Inch` = `u64_t` = `u64`.
        let nanoseconds: NanoSecond = 5 as u64_t;
        let inches: Inch = 2 as u64_t;

        // Note that type aliases *don't* provide any extra type safety, because
        // aliases are *not* new types
        println!("{} nanoseconds + {} inches = {} unit?",
                 nanoseconds,
                 inches,
                 nanoseconds + inches);
    }

The main use of aliases is to reduce boilerplate; for example the `IoResult<T>` type is an alias for the `Result<T, IoError>` type.

### See also:

Attributes