//// [typeAliases.ts]
// Writing a reference to a type alias has exactly the same effect as writing the aliased type itself.

type T1 = number;
var x1: number;
var x1: T1;

type T2 = string;
var x2: string;
var x2: T2;

type T3 = boolean;
var x3: boolean;
var x3: T3;

type T4 = void;
var x4: void;
var x4: T4;

type T5 = any;
var x5: any;
var x5: T5;

interface I6 { x : string }
type T6 = I6;
var x6: I6;
var x6: T6;

class C7 { x: boolean }
type T7 = C7;
var x7: C7;
var x7: T7;

type T8 = string | boolean;
var x8: string | boolean;
var x8: T8;

type T9 = () => string;
var x9: () => string;
var x9: T9;

type T10 = { x: number };
var x10: { x: number };
var x10: T10;

type T11 = { new(): boolean };
var x11: { new(): boolean };
var x11: T11;

interface I13 { x: string };
type T13 = I13;
var x13_1: I13;
var x13_2: T13

declare function foo13<T1 extends I13, T2 extends T13>(t1: T1, t2: T13): void;
foo13(x13_1, x13_2);
foo13(x13_2, x13_1);

type T14 = string;
var x14: T14;

declare function foo14_1(x: T14): void;

declare function foo14_2(x: "click"): void;
declare function foo14_2(x: T14): void;

type Meters = number

enum E { x = 10 }

declare function f15(a: string): boolean;
declare function f15(a: Meters): string;
f15(E.x).toLowerCase();

type StringAndBoolean = [string, boolean]
declare function f16(s: StringAndBoolean): string;
var x: [string, boolean];
f16(x);

var y: StringAndBoolean = ["1", false];
y[0].toLowerCase();

//// [typeAliases.js]
// Writing a reference to a type alias has exactly the same effect as writing the aliased type itself.
var x1;
var x1;
var x2;
var x2;
var x3;
var x3;
var x4;
var x4;
var x5;
var x5;
var x6;
var x6;
var C7 = (function () {
    function C7() {
    }
    return C7;
})();
var x7;
var x7;
var x8;
var x8;
var x9;
var x9;
var x10;
var x10;
var x11;
var x11;
;
var x13_1;
var x13_2;
foo13(x13_1, x13_2);
foo13(x13_2, x13_1);
var x14;
var E;
(function (E) {
    E[E["x"] = 10] = "x";
})(E || (E = {}));
f15(E.x).toLowerCase();
var x;
f16(x);
var y = ["1", false];
y[0].toLowerCase();
