모든 타입의 subtype 이며, 모든 타입에 할당 할 수 있다.
반대로 never 에는 그 어떤 것도 할당 할 수 없다.
any 조차도 never 에 할당 할 수 없다.
잘못된 타입을 넣는 실수를 방지할 수 있다.
// throw 되는 시점에서 함수가 끝까지 가지 않고 return 이 없다.
// 그렇기 때문에 never 를 사용할 수 있다.
function error(message: string): never {
  throw new Error(message);
}

function fail() {
  return error('failed');
}

// 무한 루프 에서도 return 없다.
function infiniteLoop(): never {
  while (true) {}
}

let a: string = 'hello';
if (typeof a !== 'string') {
  a; // a가 never 가 되었다. a 에다가 아무것도 할 수 없게 막는다.
}

declare let s: string | number;
if (typeof s !== 'string') {
  s; // s 가 number 가 된다.
}

type Indexable<T> = T extends string ? T & { [index: string]: any } : never;

type ObjectIndexable = Indexable<{}>; // ObjectIndexable는 never 가 된다. 아무것도 할당 못하게 막아준다.