ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 5.30 TypeScript의 연산자 활용 타입 유니온(Union) 타입과 인터섹션(Intersection) 포팅
    코드스테이츠 2023. 5. 31. 16:07

    유니온 타입

    /* 코드를 작성한 뒤 터미널에 순서대로
    1. tsc src/index.ts
    2. node src/index.js 
    라고 치면 결과를 확인해볼 수 있습니다. */
    
    function printAge(person) {
      let age;
      if (typeof person.age === 'number' || typeof person.age === 'string') {
        age = person.age.toString();
      }
      console.log(`${person.name}의 나이는 ${age}살 입니다.`);
    }
    
    const kimcoding = {
      name: '김코딩',
      age: 30,
    };
    
    const parhacker = {
      name: '박해커',
      age: '서른',
    };
    
    printAge(kimcoding);
    printAge(parhacker);

    /* 코드를 작성한 뒤 터미널에 순서대로
    1. tsc src/index.ts
    2. node src/index.js 
    라고 치면 결과를 확인해볼 수 있습니다. */
    
    interface person {
      name: string;
      age: number | string;
    }
    
    function printAge(person) {
      let age: number | string;
      if (typeof person.age === 'number' || typeof person.age === 'string') {
        age = person.age.toString();
      }
      console.log(`${person.name}의 나이는 ${age}살 입니다.`);
    }
    
    const kimcoding = {
      name: '김코딩',
      age: 30,
    };
    
    const parhacker = {
      name: '박해커',
      age: '서른',
    };
    
    printAge(kimcoding);
    printAge(parhacker);

    출력

     

    인터섹션 타입

    /* 코드를 작성한 뒤 터미널에 순서대로
    1. tsc src/index.ts
    2. node src/index.js 
    라고 치면 결과를 확인해볼 수 있습니다. */
    
    function sendEmail(user) {
      console.log(`안녕하세요, ${user.name}!`);
      if (user.isAdmin) {
        console.log(
          `
          권한이 admin이시군요.
          이메일은 ${user.email} 입니다.
          `
        );
      } else {
        console.log(
          `
          권한이 user이시군요.
          이메일은 ${user.email} 입니다.
          `
        );
      }
    }
    
    const kimcoding = {
      name: '김코딩',
      email: 'kimcoding@codestates.com',
      isAdmin: false,
    };
    
    const parkhacker = {
      name: '박해커',
      email: 'parkhacker@codestates.com',
      isAdmin: true,
    };
    
    sendEmail(kimcoding);
    sendEmail(parkhacker);

    /* 코드를 작성한 뒤 터미널에 순서대로
    1. tsc src/index.ts
    2. node src/index.js 
    라고 치면 결과를 확인해볼 수 있습니다. */
    
    interface EmailUser {
      name: string;
      email: string;
    }
    
    interface AdminUser {
      name: string;
      isAdmin: boolean;
    }
    
    function sendEmail(user: EmailUser & AdminUser) {
      console.log(`안녕하세요, ${user.name}!`);
      if (user.isAdmin) {
        console.log(
          `
          권한이 admin이시군요.
          이메일은 ${user.email} 입니다.
          `
        );
      } else {
        console.log(
          `
          권한이 user이시군요.
          이메일은 ${user.email} 입니다.
          `
        );
      }
    }
    
    const kimcoding = {
      name: '김코딩',
      email: 'kimcoding@codestates.com',
      isAdmin: false,
    };
    
    const parkhacker = {
      name: '박해커',
      email: 'parkhacker@codestates.com',
      isAdmin: true,
    };
    
    sendEmail(kimcoding);
    sendEmail(parkhacker);

    출력

     

     

     

     

    💁‍♀️ 유니온과 인터섹션 타입에 대한 설명으로 옳지 않은 것을 고르세요.

     

     

    A. 유니온 타입을 사용하면 타입을 추론할 수 있기 때문에 타입에 관련된 API를 자동완성으로 쉽게 얻을 수 있습니다.
    B. 유니온 타입이나 인터섹션 타입 모두 타입 가드가 필요하지 않습니다.
    C. 유니온 타입은 인자를 보낼 때 프로퍼티 중 어떤 것을 보낼 지 선택할 수 있지만, 인터섹션 타입은 인자를 보낼 때 프로퍼티를 전부 보내줘야 합니다.
    D. any를 사용해 매개변수를 정의하는 것은 JavaScript를 사용해 작성하는 것과 별 차이가 없기 때문에 유니온 타입을 사용해 작성하는 것이 좋습니다.

     

    🔈 해설

    정답 B

    B : 유니온 타입은 유니온 타입으로 정의한 둘 이상의 타입 내의 공통 프로퍼티에만 접근할 수 있어 타입 가드가 따로 필요합니다. 그러나 인터섹션 타입은 둘 이상의 타입을 결합해 새로운 타입을 만들어 내는 방법이므로 타입 가드가 필요하지 않습니다.

     


     

    '코드스테이츠' 카테고리의 다른 글

    5.31 TS열거형실습  (0) 2023.05.31
    5.31 TS 열거형  (0) 2023.05.31
    5.30 TypeScript의 연산자 활용 타입  (0) 2023.05.31
    5.30 TypeScript의 함수 포팅  (0) 2023.05.31
    5.30 TypeScript의 함수  (0) 2023.05.30
Designed by Tistory.