Type aliases

Type aliases allow names to be associated with arbitrary types.
```typescript
type StringOrNumber = string | number;
type Text = string | string[];
type Point = [number, number];
type NameLookup = Dictionary<string, Person>;
type Callback = (data: string) => void;
var fullName: {
    first: string;
    middle: string;
    last: string;
};
type Name = typeof fullName;
```
Type aliases are particuarly useful for naming types that are not object types, such as union types or primitive types.

Type aliases can alias instantiations of generic types (as in the `NameLookup` type above), but they cannot themselves have type parameters.

Just like interface declarations, type aliases declare only types and not values. For example:
```typescript
class List<T> {
    // List implementation
}
type StringList = List<string>;
var x: StringList = new StringList();  // Error, cannot find name 'StringList'
```
An error occurs on `new StringList()` because there is no constructor function named StringList. Only a type by that name exists. To get both, a subclass can be declared:
```typescript
class List<T> {
    // List implementation
}
class StringList extends List<string> { }
var x: StringList = new StringList();  // Ok