Union&Intersection

1. μœ λ‹ˆμ˜¨(Union) νƒ€μž…

  • λ‘˜ μ΄μƒμ˜ νƒ€μž…μ„ ν•©μ³μ„œ λ§Œλ“€μ–΄μ§„ μƒˆλ‘œμš΄ νƒ€μž…

  • | μ—°μ‚°μžλ₯Ό μ΄μš©ν•˜λ©°, μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ || (OR) μ—°μ‚°μžμ™€ 같이 β€œAμ΄κ±°λ‚˜ Bμ΄λ‹€β€λΌλŠ” 의미의 νƒ€μž… (e.g. number | string : 숫자 λ˜λŠ” λ¬Έμžμ—΄ νƒ€μž…)

  • value λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž…μ„ any둜 μ •μ˜ν•˜κ³ , νƒ€μž…μ΄ number인지 string인지에 따라 if-else 문으둜 λ‚˜λˆ„μ–΄ 좜λ ₯ν•œ 경우

      function printValue(value: any): void {
      if (typeof value === "number") {
          console.log(`The value is a number: ${value}`);
      } else {
          console.log(`The value is a string: ${value}`);
      }
      }
    
      printValue(10); // The value is a number: 10
      printValue("hello"); // The value is a string: hello
  • any μ‚¬μš©μ€ JavaScript μž‘μ„± μ½”λ“œμ™€ 큰 차이가 없기에, μœ λ‹ˆμ˜¨ νƒ€μž…μ„ μ‚¬μš©ν•΄ TypeScript의 이점을 살리 μ½”λ”©ν•˜λŠ” 것이 μ’‹μŒ

    function printValue(value: number|string): void {
      if (typeof value === "number") {
          console.log(`The value is a number: ${value}`);
      } else { 
          console.log(`The value is a string: ${value}`);
      }
    }
    
    printValue(10); // The value is a number: 10
    printValue("hello"); // The value is a string: hello
  • μœ„μ˜ printValue ν•¨μˆ˜λŠ” 숫자 λ˜λŠ” λ¬Έμžμ—΄ 값을 μž…λ ₯λ°›κ³  있음.

  • μ΄λ•Œ, μœ λ‹ˆμ˜¨ νƒ€μž…μ„ μ‚¬μš©ν•΄ number | string νƒ€μž…μœΌλ‘œ μ§€μ •ν•˜κ³  있음.

  • 이후 μž…λ ₯된 κ°’μ˜ νƒ€μž…μ„ typeof μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜μ—¬ 검사 β†’ ν•΄λ‹Ή 값이 숫자인 κ²½μš°μ™€ λ¬Έμžμ—΄μΈ 경우 각각 λ‹€λ₯Έ 둜그λ₯Ό 좜λ ₯

  • 이처럼 μœ λ‹ˆμ˜¨ νƒ€μž…μ€ λ‹€μ–‘ν•œ νƒ€μž…μ˜ 값을 μ²˜λ¦¬ν•΄μ•Ό ν•˜λŠ” 경우 유용

(1) μœ λ‹ˆμ˜¨(Union) νƒ€μž…μ˜ μž₯점

  • νƒ€μž…μ„ μΆ”λ‘ ν•  수 μžˆκΈ°μ—, νƒ€μž…μ— κ΄€λ ¨λœ APIλ₯Ό μ‰½κ²Œ μžλ™μ™„μ„±μœΌλ‘œ μ–»μ–΄λ‚Ό 수 있음

  • μ½”λ“œμ˜ 가독성을 높일 수 있음: νƒ€μž…μœΌλ‘œ μ„ μ–Έλœ λ³€μˆ˜λŠ” λ¬Έμžμ—΄, 숫자, λΆˆλ¦¬μ–Έ νƒ€μž… 쀑 ν•˜λ‚˜μ˜ 값을 κ°€μ§ˆ 수 μžˆλ‹€λŠ” 것이 λͺ…μ‹œμ μœΌλ‘œ ν‘œμ‹œλ˜μ–΄ μ½”λ“œλ₯Ό μ΄ν•΄ν•˜κΈ° μ‰½κ²Œ λ§Œλ“€μ–΄ 쀌

    let value: string | number | boolean;

(2) μœ λ‹ˆμ˜¨(Union) νƒ€μž… μ‚¬μš© μ‹œ μœ μ˜ν•  점

  • μœ λ‹ˆμ˜¨μ— μžˆλŠ” λͺ¨λ“  νƒ€μž…μ— 곡톡인 λ©€λ²„λ“€μ—λ§Œ μ ‘κ·Όν•  수 있기 λ•Œλ¬Έμ— μœ μ˜ν•΄μ•Ό 함

    // interfaceλ₯Ό μ‚¬μš©ν•΄ Developer와 Person을 μ •μ˜
    interface Developer {
      name: string;
      skill: string;
    }
    
    interface Person {
      name: string;
      age: number;
    }
    function askSomeone(someone: Developer | Person) {
      console.log(someone.name);
    }
  • μ‹€μ§ˆμ μœΌλ‘œ askSomenone ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œλŠ” Developer와 Person이 κ°–κ³  μžˆλŠ” 곡톡 ν”„λ‘œνΌν‹°μΈ nameμ—λ§Œ μ ‘κ·Ό κ°€λŠ₯. κ³΅ν†΅λ˜κ³  보μž₯된 ν”„λ‘œνΌν‹°λ§Œ μ œκ³΅ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έ

  • λ§Œμ•½ λ‚˜λ¨Έμ§€ ν”„λ‘œνΌν‹°μ—λ„ μ ‘κ·Όν•˜κ³  μ‹Άλ‹€λ©΄ νƒ€μž… κ°€λ“œλ₯Ό μ‚¬μš©ν•΄μ•Ό 함. (νƒ€μž… κ°€λ“œ: TypeScriptμ—μ„œ νƒ€μž…μ„ λ³΄ν˜Έν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” κΈ°λŠ₯ 쀑 ν•˜λ‚˜λ‘œ, νŠΉμ • μ½”λ“œ λΈ”λ‘μ—μ„œ νƒ€μž…μ˜ λ²”μœ„λ₯Ό μ œν•œν•΄ ν•΄λ‹Ή μ½”λ“œ 블둝 μ•ˆμ—μ„œ νƒ€μž… μ•ˆμ •μ„±μ„ 보μž₯ν•΄ 쀌)

    function askSomeone(someone: Developer | Person) {
      // in μ—°μ‚°μž : νƒ€μž…μŠ€ν¬λ¦½νŠΈμ—μ„œ 객체의 μ†μ„±μ˜ 쑴재 μ—¬λΆ€λ₯Ό μ²΄ν¬ν•˜λŠ” μ—°μ‚°μž
      // in μ—°μ‚°μžλŠ” 객체의 속성 이름과 ν•¨κ»˜ μ‚¬μš©ν•˜μ—¬ ν•΄λ‹Ή 속성이 객체 내에 μ‘΄μž¬ν•˜λŠ”μ§€ μ—¬λΆ€λ₯Ό 검사
      
      if ('skill' in someone) {
          console.log(someone.skill);
      }
    
      if ('age' in someone) {
          console.log(someone.age);
      }
    }

2. μΈν„°μ„Ήμ…˜(Intersection) νƒ€μž…

  • λ‘˜ μ΄μƒμ˜ νƒ€μž…μ„ κ²°ν•©ν•˜μ—¬ μƒˆλ‘œμš΄ νƒ€μž…μ„ λ§Œλ“œλŠ” 방법

  • & μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜μ—¬ ν‘œν˜„

  • νƒ€μž…μ„ κ²°ν•©ν•΄ μ•„λž˜ Developer와 Person 각각에 μ •μ˜λœ 속성 λͺ¨λ‘ λ°›μŒ

    interface Developer {
      name: string;
      skill: string;
    }
    
    interface Person {
      name: string;
      age: number;
    }
    
    // νƒ€μž… κ²°ν•©
    type User = Developer & Person;
  • &둜 νƒ€μž…μ„ μ—°κ²°ν•΄ ν•˜λ‚˜μ˜ 단일 νƒ€μž…μœΌλ‘œ ν‘œν˜„ν•  수 μžˆκΈ°μ—, νƒ€μž… κ°€λ“œκ°€ ν•„μš” μ—†μŒ

  • askSomeone ν•¨μˆ˜ 내에 μ •μ˜λœ ν”„λ‘œνΌν‹°μ— μ „λΆ€ μ ‘κ·Ό κ°€λŠ₯

      interface Developer {
      name: string;
      skill: string;
      }
    
      interface Person {
      name: string;
      age: number;
      }
    
      // νƒ€μž… κ²°ν•©ν•΄ κ°€λ“œ ν•„μš” X
      function askSomeone(someone: Developer & Person) {
          console.log(someone.age);
          console.log(someone.name);
          console.log(someone.skill);
      }
  • 반면 Developer와 Personμ΄λΌλŠ” μƒˆλ‘œμš΄ ꡐ집합을 λ§Œλ“€μ–΄ λ‚΄λŠ” 것이기에, μ „λ‹¬μΈμžλ₯Ό 전달할 λ•Œ λͺ¨λ“  ν”„λ‘œνΌν‹°λ₯Ό μ „λΆ€ λ³΄λ‚΄μ€˜μ•Όλ§Œ 함.

  • λ°˜λŒ€λ‘œ μœ λ‹ˆμ˜¨ νƒ€μž…μ€ νƒ€μž… κ°€λ“œλ₯Ό ν•΄μ€˜μ•Ό ν•˜μ§€λ§Œ μ „λ‹¬μΈμžλ₯Ό 전달할 λ•Œ 선택지가 μƒκΈ°κ²Œ 됨

      interface Developer {
      name: string;
      skill: string;
      }
    
      interface Person {
      name: string;
      age: number;
      }
    
      function askSomeone(someone: Developer | Person) {
          // μ•„λž˜μ™€ 같이 ν”„λ‘œνΌν‹°μ— μ ‘κ·Ό
          if ('skill' in someone) {
              console.log(someone.skill);
          }
    
          if ('age' in someone) {
              console.log(someone.age);
          }
      }
    
      // μœ λ‹ˆμ˜¨ νƒ€μž…μ€ μ „λ‹¬μΈμžλ₯Ό 전달할 λ•Œ 선택지가 생김
      askSomeone({name: 'κΉ€μ½”λ”©', skill: 'μ›Ή 개발'});
      askSomeone({name: 'κΉ€μ½”λ”©', age: 20});
    
      function askSomeone2(someone: Developer & Person) {
          // νƒ€μž… κ°€λ“œλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ•„λ„ λͺ¨λ“  ν”„λ‘œνΌν‹°μ— μ ‘κ·Όν•  수 있음
          console.log(someone.age);
          console.log(someone.name);
          console.log(someone.skill);
      }
    
      // κ·ΈλŸ¬λ‚˜ μΈν„°μ„Ήμ…˜ νƒ€μž…μœΌλ‘œ κ²°ν•©ν•˜κ²Œ λœλ‹€λ©΄ μ „λ‹¬μΈμžλ₯Ό 전달할 λ•Œ 선택지가 μ—†μŒ
      askSomeone2({name: 'κΉ€μ½”λ”©', skill: 'μ›Ή 개발', age: 20});
    

Last updated