Eun_Frontend
  • [TypeScript] TypeScript 공부일지: 타입 단언 [6/7 study]
    2024년 06월 07일 16시 11분 59초에 업로드 된 글입니다.
    작성자: 동혁이

     

     

    TypeScript 공부일지: 타입 단언

     

     


    ❗️주의

    지극히 개인 공부한 내용을 올린 거기 때문에 이해하지 못할 수도 있음

     

    ❗️타입 단언

    /**
     * 타입 단언
     */
    
    type Person = {
      name: string;
      age: number;
    };
    
    // 아래와 같이하면 Person 타입이 지금 초기화 값인 빈 객체를 기준 값으로 추론되어 버리기 때문에
    // person 변수의 타입이 그냥 빈 객체로 추론되어 버림
    // 그래서 name 과 age 프로퍼티가 없다는 경고가 나옴
    // let person = {};
    // person.name = "이정환";
    // person.age = 27;
    
    // 이렇게 우리 의도와 다르게 변수의 타입이 추론 되어버리기 때문에
    // 원하는 기능을 만들기 어려울때는 초기화 값의 타입을 단언 해주면 됨
    // as 쓰고 타입을 쓰면 TS 컴파일러한테 이 타입으로 간주하라고 말하는거임
    // 이렇게 값의 타입을 프로그래머가 직접 단언하는 방법을 타입 단언 (Type Assertion)이라 함
    
    let person = {} as Person;
    person.name = "이정환";
    person.age = 27;
    
    type Dog = {
      name: string;
      color: string;
    };
    
    // let dog: Dog = {
    //   name: "돌돌이",
    //   color: "brown",
    //   // breed: "진도", 초과 프로퍼티 검사 발동
    // };
    
    let dog = {
      name: "돌돌이",
      color: "brown",
      breed: "진도",
    } as Dog;
    
    /**
     * 타입 단언의 규칙
     * 값 as 단언 <- 단언식
     * A as B (라고 할 때)
     * A가 B의 슈퍼타입이거나
     * A가 B의 서브타입이어야 함
     */
    
    // 10은 number 타입이고 never 타입은 모든 타입의 서브타입이기 때문에 A 가 B의 슈퍼타입 임
    // 이 규칙을 만족하기 때문에 타입 단언이 이루어 짐
    let num1 = 10 as never;
    // A가 B의 서브 타입이기 때문에 규칙 만족
    let num2 = 10 as unknown;
    
    // let num3 = 10 as string; 슈퍼 서브 타입이 아님
    
    /**
     * const 단언
     */
    
    // 뒤에 const를 붙이면 number literal type 으로 추론됨
    let num4 = 10 as const;
    
    // 특히 const 단언은 객체랑 같이 쓸 때 좋은데용
    // const 붙이면 모든 프로퍼티가 readonly 읽기 전용 프로퍼티로 변함
    let cat = {
      name: "야옹이",
      color: "yellow",
    } as const;
    // as const를 붙여서 초기화한 객체는
    // property의 값을 수정할 수 없는 객체가 됨
    // cat.name = "멍뭉이"; (읽기 전용 속성으로 변했기 때문임)
    
    /**
     * Non, Null 단언
     * 어떤값이 null 이나 undefined가 아니라고 TS compiler에게 알려주는 역할을 함
     */
    
    // 예시 상황 게시판을 만들거임 익명이 가능하기 때문에 author는 없앨수도 있으므로
    // optional chaining 사용함 
    // (선택적 프로퍼티로 만듬)
    // (앞의 평가 대상이 undefined나 null이면 평가를 멈추고 undefined를 반환한다.)
    
    type Post = {
      title: string;
      author?: string;
    };
    
    let post: Post = {
      title: "게시글1",
      author: "이정환",
    };
    
    // 오류 : number | undefined 형식은 number형식에 해당할 수 없음
    // const len: number = post.author?.length
    
    // 이 오류를 해결하려면 ? 물음표가 아니라 ! 느낌표 사용하면 됨x
    // 느낌 author는 undefined이 아니라 값이 있어?! 라는 느낌??
    // ! 느낌표 연산이 non null 단언임
    // author가 null 이나 undefined가 아니라고 컴파일러가 믿도록 만듬
    const len: number = post.author!.length;

     

     

    ❗️정리

    - type 단언은 실제로 그 값을 단언한 type으로 바꾸는거는 아님

    - upcasting , downcasting이랑 다름

    - 그냥 TS compiler의 눈을 잠깐 가리는 역할을 할 뿐임

    - 그래서 non null 단언 같은 경우에도 author 프로퍼티가 없어도 믿음

    - 위험하기 때문에 진짜 쓸 상황아니면 안쓰는게 좋음

     

    댓글