이펙티브 타입스크립트: 3장 요약 및 핵심 정리

2025. 1. 24. 23:40Programming Language/Typescript

반응형

이펙티브 타입스크립트 3장에서는 타입스크립트를 효과적으로 사용하는 방법에 대해 다룹니다. 주로 타입 설계와 작성 시 올바른 습관과 패턴을 강조하며, 타입스크립트 코드의 품질과 유지보수성을 높이는 다양한 전략을 소개합니다.


1. 값을 기준으로 타입을 설계하라

타입 설계는 프로그램에서 사용하는 값(value)을 기반으로 해야 합니다. 타입은 값이 가질 수 있는 가능한 상태를 모델링하는 것이며, 실제 값이 타입의 설계와 잘 맞아야 합니다.

const status = "success"; // 값 기반 타입 설계
type Status = "success" | "error" | "loading"; // 유효한 상태만 나열

Tip: 값의 패턴과 의미를 반영한 타입을 설계하면 불필요한 오류를 줄이고, 의도를 명확히 할 수 있습니다.


2. 타입 간의 차이를 명확히 하라

서로 다른 타입은 혼동되지 않도록 명확히 구분해야 합니다. 동일한 구조를 가진 타입이라도, 의미가 다른 경우 별도의 타입으로 구분하는 것이 중요합니다.

type UserId = string;
type OrderId = string;

function getUser(userId: UserId) { /* ... */ }
function getOrder(orderId: OrderId) { /* ... */ }

const id: string = "1234";
getUser(id as UserId); // 안전한 타입 변환

Tip: 의미적으로 구별되는 타입에는 명시적으로 이름을 붙여 혼란을 방지하세요.


3. 타입 좁히기 전략

타입 좁히기는 코드의 안정성을 높이는 중요한 기술입니다. 타입스크립트에서 제공하는 타입 가드를 사용하면 조건에 따라 타입을 정확히 좁힐 수 있습니다.

function isString(value: unknown): value is string {
  return typeof value === "string";
}

function printValue(value: string | number) {
  if (isString(value)) {
    console.log(value.toUpperCase());
  } else {
    console.log(value.toFixed(2));
  }
}

Tip: typeof, instanceof, 사용자 정의 타입 가드를 사용해 타입을 안전하게 좁히세요.


4. 타입 별칭과 인터페이스 활용

  • 타입 별칭(Type Alias): 유연한 타입 정의를 위해 사용합니다.
  • 인터페이스(Interface): 객체 타입을 정의할 때 사용하며, 확장(extend)이 가능합니다.
// 타입 별칭
type Point = { x: number; y: number };

// 인터페이스
interface Shape {
  area(): number;
}

Tip: 복잡한 구조나 객체 타입은 인터페이스로, 간단한 타입 정의는 타입 별칭으로 작성하세요.


5. 유니언(Union)과 인터섹션(Intersection)

  • 유니언 타입: 여러 가능한 타입 중 하나를 나타냅니다.
  • 인터섹션 타입: 여러 타입의 조합을 나타냅니다.
type Success = { status: "success"; data: string };
type Error = { status: "error"; error: string };

type Response = Success | Error; // 유니언

Tip: 유니언 타입으로 모델링하면 다양한 상태를 안전하게 표현할 수 있습니다.


6. 엄격한 null 체크

타입스크립트에서 strictNullChecks 옵션을 활성화하면 nullundefined를 명확히 구분할 수 있습니다. 이는 불필요한 null 관련 오류를 방지하는 데 유용합니다.

function processValue(value?: string | null) {
  if (value !== null && value !== undefined) {
    console.log(value.toUpperCase());
  }
}

Tip: null이나 undefined 값을 다룰 때는 항상 방어적 코드를 작성하세요.


7. 불변성을 활용하라

타입스크립트의 readonly를 활용해 데이터의 불변성을 유지하면, 예상치 못한 데이터 변경을 방지할 수 있습니다.

type User = {
  readonly id: number;
  name: string;
};

const user: User = { id: 1, name: "Henry" };
// user.id = 2; // 오류 발생

Tip: 데이터 변경이 필요하지 않은 경우 readonly를 활용해 안정성을 높이세요.


마무리

이펙티브 타입스크립트 3장은 타입 설계와 사용에서 올바른 접근 방식을 배우는 데 중점을 둡니다. 값 기반 타입 설계, 타입 간 구분, 타입 좁히기 등의 전략을 잘 활용하면 코드의 명확성과 안전성을 크게 향상시킬 수 있습니다.

반응형