포스트

[Frontend] 타입 단언(Type Assertion)이란? 안전하게 사용하는 법

[Frontend] 타입 단언(Type Assertion)이란? 안전하게 사용하는 법

들어가며

타입 단언(Type Assertion)이란, 개발자가 컴파일러보다 타입을 더 정확히 알고 있다고 알려주는 방법입니다.
즉, 타입스크립트가 자동으로 추론한 타입 대신, 개발자가 명시적으로 “이 값은 이 타입이야!”라고 단언하는 것입니다. 가장 흔한 문법은 as 키워드를 사용하는 방식입니다.

1
const element = document.getElementById("myElement") as HTMLDivElement;

이 글에서는 타입 단언의 개념, 사용 시기, 주의사항, 그리고 더 안전하게 사용하는 팁까지 예제와 함께 알아보겠습니다.

목차

  1. 타입 단언이 필요한 이유
  2. 타입 단언 기본 문법
  3. 언제 타입 단언을 사용하나요?
  4. 주의할 점
  5. 안전하게 사용하는 팁
  6. 정리
  7. 참고 자료

1. 타입 단언이 필요한 이유

TypeScript는 타입을 자동으로 추론하지만, 항상 정확한 타입을 유추하지는 못합니다. 특히 DOM API, 외부 라이브러리, JSON 파싱 등에서는 타입이 모호할 수 있습니다.

예를 들어:

1
2
const el = document.getElementById("box");
el.style.backgroundColor = "blue"; // ❌ 오류 발생: el은 HTMLElement | null

elHTMLElement | null 타입이기 때문에, 바로 style에 접근하면 오류가 발생합니다. 이럴 때 타입 단언을 사용하면 해결됩니다:

1
2
const el = document.getElementById("box") as HTMLDivElement;
el.style.backgroundColor = "blue"; // ✅ OK

2. 타입 단언 기본 문법

✅ as 문법

1
const name = "Jungwoo" as string;

✅ 꺾쇠 문법 ()

1
const age = <number>25;

⚠️ 꺾쇠 문법은 JSX 환경(React 등)에서는 문법 충돌이 발생할 수 있으므로 보통 as 문법을 추천합니다.

3. 언제 타입 단언을 사용하나요?

  • DOM 조작 시: getElementById, querySelector 등에서 반환값이 HTMLElement | null일 때
  • 외부 라이브러리: 타입 정의가 부정확하거나 없을 경우
  • JSON 파싱: JSON.parse()any를 반환하므로 명시적인 타입이 필요할 때
  • 명확하게 타입이 확실한 경우: 실제 값이 어떤 타입인지 개발자가 100% 확신할 때

예시: DOM 요소 단언

1
2
const input = document.querySelector("#username") as HTMLInputElement;
input.value = "정우";

예시: JSON 파싱

1
2
3
type User = { name: string; age: number };
const json = '{"name":"정우","age":30}';
const user = JSON.parse(json) as User;

4. 타입 단언의 주의점 😱

타입 단언은 컴파일러의 타입 검사를 우회합니다. 잘못된 타입을 단언하면 런타임 오류로 이어질 수 있습니다.

1
2
const el = document.getElementById("box") as HTMLCanvasElement;
el.getContext("2d"); // ❌ HTMLElement라면 에러 발생

따라서 “확실한 경우에만” 타입 단언을 사용해야 하며, 가능하면 타입 내로잉, 타입 가드 등의 더 안전한 방식을 우선적으로 사용하는 것이 좋습니다.

5. 안전하게 사용하는 팁 ✅

1. 타입 내로잉을 우선 사용하기

1
2
3
4
5
6
7
function printLength(value: string | string[]) {
  if (Array.isArray(value)) {
    console.log(value.length); // ✅ 배열로 안전하게 처리
  } else {
    console.log(value.length); // ✅ 문자열로 안전하게 처리
  }
}

2. 타입 가드(type predicate) 사용하기

1
2
3
4
5
6
7
8
9
10
11
type Fish = { swim: () => void };
type Bird = { fly: () => void };

function isFish(pet: Fish | Bird): pet is Fish {
  return (pet as Fish).swim !== undefined;
}

const pet: Fish | Bird = getPet();
if (isFish(pet)) {
  pet.swim(); // ✅ 안전하게 swim 호출
}

3. 필요한 부분만 단언하기

전체 객체보다는 접근하려는 속성이나 부분만 단언하는 것이 안전합니다.

1
2
3
4
const el = document.getElementById("box");
if (el) {
  (el as HTMLDivElement).style.color = "red"; // ✅ 최소 범위 단언
}

6. 정리

항목설명
타입 단언이란?컴파일러의 타입 추론을 개발자가 덮어쓰는 기능
언제 사용?컴파일러가 타입을 추론하지 못하거나, 외부 API 결과가 명확할 때
문법as 타입, <타입> (비추천)
주의사항잘못된 단언은 런타임 오류 유발
대안타입 내로잉, 타입 가드, 명확한 타입 정의 우선

7. 참고 자료

as 한 줄이면 오류가 사라진다? 하지만 그게 꼭 정답은 아닙니다. 타입 단언은 신중하게, 꼭 필요한 순간에만 사용해보세요. 🙌

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.