[러닝 타입스크립트] Chapter 3 유니언과 리터럴 타입

해리포터·2023년 3월 2일
0
post-thumbnail

유니언 타입


타입스크립트는 값을 바탕으로 타입을 추론한다.

타입 추론의 두 가지 핵심 개념 (타입스크립트에서만 존재)

  • 유니언
  • 내로잉(narrowin)

유니언

let mathematician: string | undefined = Math.random() > 0.5 ? undefined : "Mark Goldberg";
  • 값에 허용되는 타입을 두 가지 이상으로 나타내는 타입이다.
  • | 를 사용해서 유니언 타입임을 나타낸다.
    • 유니언 타입 선언의 순서는 중요하지 않다.
      • string | undefinedundefined | string 이나 같다.
  • 유니언 타입으로 선언한 변수에 메서드를 사용할 경우 유니언 타입 모두에 있는 메서드만 사용 가능하다.
    let physicist = Math.random() > 0.5 ? "Marie Curie" : 84;
    
    physicist.toString(); // 사용 가능 -> toString는 string, number 모두 사용가능한 메서드이다.
    physicist.toUpperCase(); // ❌ toUpperCase는 string에서만 사용 가능해서 안된다.
    physicist.toFixed(); // ❌ toFixed는 number에서만 사용 가능해서 안된다.

내로잉(narrowing)

타입 가드

  • 타입을 좁히는데 사용

타입스크립트가 타입을 좁힐 때 사용하는 타입 가드 세 가지

  1. 값 할당을 통한 내로잉
    • 변수에 초기값이 할당되는 시점에 할당되는 값의 타입으로 내로잉된다.
      let admiral: number | string;
      
      admiral = "Harry Potter"; // 이 시점에 admiral의 타입이 string으로 내로잉된다.
      
      admiral.toUpperCase(); // 사용 가능
      admiral.toFixed(); // ❌ admiral의 타입이 string으로 내로잉되었으므로 number 타입의 속성인 toFixed는 사용 불가하다.
  2. 조건 검사를 통한 내로잉
    • if 문을 통해서 변수의 타입을 좁히는 방법
      let friend = Math.random() > 0.5 ? "Harry Potter" : 22;
      
      if (friend === "Harry Potter") {
      	friend.toUpperCase(); // friend가 string 이기 때문에 사용 가능
      }
      
      friend.toUpperCase(); // ❌ toUpperCase는 number 타입에 적용되지 않는 메서드이므로 에러
  3. typeof 검사를 통한 내로잉
    • if 문과 함께 typeof 연산자를 사용해서 동일 타입인지 확인하는 방법으로 타입을 좁힌다.
    • 자주 사용되는 방법이다.
      let student = Math.random() > 0.5 ? "Harry Potter" : 32; // student의 타입은 string 이거나 number 이다.
      
      if (typeof student === "string") {
      	student.toUpperCase(); // student가 string 타입이므로 toUpperCase 메서드 사용 가능
      } else {
      	student.toFixed(); // student가 number 타입이므로 toFixed 메서드 사용 가능
      }


리터럴 타입


  • 리터럴 타입은 구체적인 원시타입이다.
    • 리터럴 타입은 원시 타입 중 하나가 아닌 특정 원시값이다.
  • const로 선언한 변수에 할당된 리터럴 값이 리터럴 타입이 된다.
    const friend = "Harry";
    • 변수 friend는 string 타입이기도 하지만, 구체적인 타입은 “Harry” 이다.
  • 유니언 타입으로도 사용할 수 있다.
    let friend: "Harry" | "Ron" | number;
    
    friend = "Harry"; // 사용 가능
    friend = "Ron"; // 사용 가능
    friend = 233; // 사용 가능
    friend = true; // ❌ 에러
    friend = "Voldemort"; // ❌ 에러

Strict Null Checking


  • tsconfig.json 에서 strictNullChecks: true 로 설정하는 것이 타입스크립트의 권장사항이다.
    • 코드가 null 또는 undefined 값으로 인한 에러(aka 십억 달러의 실수)로부터 안전하게 할 수 있다.

Type Alias


type 내가 짓는 타입 이름 = 타입
type RawData = boolean | number | string | null | undefined;

let firstData: RawData;
let secondData: RawData;
  • 복잡한 타입을 가질 경우에 사용한다.
    • 입력하기 불편한 긴 유니언 타입일 경우 사용
  • 파스칼 케이스로 이름을 지정한다.
  • 타입스크립트에서만 사용되며 자바스크립트로 컴파일되지 않는다.
  • Type Alias 를 결합해서 유니언 타입으로 나타낼 수 있다.
profile
FE Developer 매일 한 걸음씩!

0개의 댓글