[TypeScript] unknown 타입

unknown 타입이란

unknown 타입은 모든 값을 할당할 수 있는 최상위 타입입니다. any 타입과 유사하게 어떤 값도 담을 수 있지만, unknown 타입 변수에 대해 값을 사용하기 전에 반드시 해당 값의 타입을 좁혀(narrow) 주어야 합니다. 즉, unknown은 "무엇이든 될 수 있으나, 사용하기 전에는 그 실체를 반드시 확인하라"는 의미를 내포하고 있습니다.

unknown을 사용하는 이유

  • 타입 안전성 강화: any 타입은 타입 검사를 완전히 우회하기 때문에 예상치 못한 런타임 오류를 발생시킬 수 있습니다. unknown 타입은 사용 전에 타입 검증을 요구하여, 보다 안전한 코드 작성을 돕습니다.
  • 외부 데이터 처리: API 응답이나 제3자 라이브러리의 결과처럼 정확한 타입을 알 수 없는 경우, unknown을 사용한 후 적절한 타입 가드를 통해 타입을 확정할 수 있습니다.

any와의 간단한 비교 예제

let anyValue: any = "테스트";
console.log(anyValue.length); // 문제없이 실행 (런타임 오류 위험)

let unknownValue: unknown = "테스트";
// console.log(unknownValue.length); // 오류: unknown 타입은 length 속성 없음
if (typeof unknownValue === "string") {
  console.log(unknownValue.length); // 안전하게 실행
}
// 출력: 3

unknown 타입 사용 예제

다양한 값 할당

let data: unknown;
console.log("초기 값:", data); // 출력: 초깃값은 undefined

data = 42;
console.log("숫자 값:", data); // 출력: 42

data = "Hello TypeScript";
console.log("문자열 값:", data); // 출력: Hello TypeScript

data = { x: 10, y: 20 };
console.log("객체 값:", data); // 출력: { x: 10, y: 20 }

unknown에서 any로 할당

unknown 타입 변수는 다른 타입으로 직접 할당할 수 없습니다. 단, any나 unknown 타입에는 할당이 가능합니다.

let info: unknown = "Dynamic Data";

// 올바른 할당: unknown → unknown
let copyInfo: unknown = info;

// 올바른 할당: unknown → any
let looseInfo: any = info;

// 오류 발생: unknown → string
// let strictString: string = info; // 컴파일 에러

타입을 좁히지 않고 unknown 타입 사용 시 에러

unknown 타입은 직접 연산을 수행할 수 없으므로, 타입을 좁혀야 합니다.

let unknownData: unknown = "Type Safety";

// 아래 코드는 컴파일 에러 발생: unknown은 toUpperCase 메서드가 없다고 인식함
// console.log(unknownData.toUpperCase());

// 타입 좁히기를 통해 안전하게 사용
if (typeof unknownData === "string") {
  console.log("대문자 변환:", unknownData.toUpperCase());
}