type

타입에 대한 별칭을 만든다.

type Width = number | string;
type F1 = (a: number, b: string) => number;

null, undefined

타입으로 쓸 수 있다.

let v1: undefined = undefined;
let v2: null = null;
let v3 = 123; // ERROR

never

비정상 종료 or 무한루프

function f: never {
	throw new Error('error');
}
function f: never {
	while (true) {}
}

enum, const enum

enum 은 객체로 컴파일된다. const enum 은 컴파일 결과에 객체를 남기지 않는다.

enum USER_TYPE {
  U1,
  U2,
  U3,
}
const enum USER_TYPE_C {
  UC1,
  UC2,
  UC3,
}
const a = USER_TYPE.U2;
const b = USER_TYPE_C.UC3;

// 컴파일 이후
(function (USER_TYPE) {
    USER_TYPE[USER_TYPE["U1"] = 0] = "U1";
    USER_TYPE[USER_TYPE["U2"] = 1] = "U2";
    USER_TYPE[USER_TYPE["U3"] = 2] = "U3";
})(USER_TYPE || (USER_TYPE = {}));
var a = USER_TYPE.U2;
var b = 2 /* UC3 */;

keyof

인터페이스의 모든 속성 이름을 유니온 타입으로 반환한다.

interface UserData {
	name: string;
  phone: string;
  age: number;
}
let a: keyof UserData // 'name'|'phone'|'age'