전체 목록
TypeScriptMedium#134

any, unknown, never의 차이를 설명해주세요.

#TS#any#unknown#never

답변 포인트

타입 안전성, 검증 필요성, 도달 불가능성를 기준으로 정의, 장점, 한계, 예시를 함께 설명해보세요.

정답 및 해설

빠른 요약

any는 타입 검사를 우회하고, unknown은 사용 전 검증을 요구하며, never는 값이 존재할 수 없는 상태를 표현합니다. 외부 입력에는 any보다 unknown이 안전합니다.

any는 타입 검사를 우회하고, unknown은 사용 전 검증을 요구하며, never는 값이 존재할 수 없는 상태를 표현합니다. 외부 입력에는 any보다 unknown이 안전합니다.

핵심 개념

핵심 기준은 타입 안전성, 검증 필요성, 도달 불가능성입니다. 이 개념은 단순한 용어가 아니라, 실제 코드나 시스템에서 반복적으로 생기는 문제를 다루기 위해 등장했습니다.

TypeScript는 런타임 전에 실수를 발견하고 코드의 의도를 타입으로 문서화하기 위해 사용합니다. 좋은 타입은 자동완성, 리팩터링, 협업 안정성을 높여줍니다.

동작 흐름

  1. 먼저 어떤 문제가 있는지 확인합니다.
  2. 이 개념이 그 문제를 어떤 기준으로 나누거나 해결하는지 봅니다.
  3. 실제 코드에서는 입력, 상태, 실행 순서, 비용이 어떻게 바뀌는지 확인합니다.
  4. 마지막으로 한계와 부작용을 함께 점검합니다.

실제 예시

TypeScript
function parse(value: unknown) {
  if (typeof value === "string") {
    return value.toUpperCase();
  }
  throw new Error("문자열이 아닙니다");
}

function assertNever(value: never): never {
  throw new Error(`Unexpected value: ${value}`);
}

unknown은 사용 전 검증을 요구하고, never는 도달하면 안 되는 상태를 표현합니다.

실무에서 주의할 점

  • 타입 단언으로 오류를 덮기보다 타입을 좁히는 코드를 먼저 고려합니다.
  • 런타임 검증이 필요한 외부 입력은 타입만으로 안전해지지 않습니다.
  • 공개 타입은 너무 구체적이어도, 너무 느슨해도 유지보수가 어려워집니다.

함께 연결해서 보면 좋은 키워드

TS, any, unknown, never

정리

한 줄로 정리하면, any는 타입 검사를 우회하고, unknown은 사용 전 검증을 요구하며, never는 값이 존재할 수 없는 상태를 표현합니다. 외부 입력에는 any보다 unknown이 안전합니다. 실무에서는 개념을 적용하는 조건과 적용하지 않았을 때 생기는 문제까지 함께 이해하는 것이 중요합니다.

세 타입을 한 문장으로 구분하기

any는 타입 안전성을 끄는 타입, unknown은 사용 전에 검증해야 하는 안전한 최상위 타입, never는 존재할 수 없는 타입입니다.

TypeScript
let a: any = 1;
a.foo.bar(); // 컴파일 가능, 런타임 오류 위험

let u: unknown = 1;
// u.foo; // 컴파일 에러
if (typeof u === 'number') {
  console.log(u.toFixed(2));
}

never 예시

TypeScript
function fail(message: string): never {
  throw new Error(message);
}

type Shape = { kind: 'circle'; r: number } | { kind: 'square'; size: number };

function area(shape: Shape) {
  switch (shape.kind) {
    case 'circle': return Math.PI * shape.r ** 2;
    case 'square': return shape.size ** 2;
    default: {
      const exhaustive: never = shape;
      return exhaustive;
    }
  }
}

실무 권장

외부 API 응답, catch의 error, JSON.parse 결과는 unknown으로 받고 검증합니다. any는 마이그레이션 중 임시로만 사용하고 TODO/범위를 남기는 것이 좋습니다.

관련 질문

같은 카테고리/태그 기준