ν”„λ‘œμ νŠΈ 기둝/YSS | μ—°μ„ΈλŒ€ν•™κ΅ κ³΅κ°„λŒ€κ΄€ μ„œλΉ„μŠ€

(μ—λŸ¬ ν•΄κ²°) Union typeκ³Ό νƒ€μž… κ°€λ“œ ν•¨κ»˜ μ‚¬μš©ν•˜κΈ°

μ€λ˜λ”” 2022. 9. 19. 01:40

Union type

| μ—°μ‚°μžλ‘œ μ—¬λŸ¬ 개의 νƒ€μž…μ΄ μ—°κ²°λœ νƒ€μž…μ„ μ˜λ―Έν•œλ‹€. μ΄λ•Œ | μ—°μ‚°μžλŠ” or의 의미λ₯Ό 가지고 μžˆλ‹€. μ΄λŸ¬ν•œ Union type을 ν™œμš©ν•΄ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ •μ˜ν•˜κ³ μž ν–ˆλ‹€.

문제 μ •μ˜

interface Props {
  data: LectureRoomsPerBuilding | LectureRoomInfo;
  children?: LectureRoomInfo[];
}

λ‹€μŒκ³Ό 같이 μΈν„°νŽ˜μ΄μŠ€λ₯Ό μž‘μ„±ν–ˆλŠ”λ°, νƒ€μž… μΆ”λ‘ μ—μ„œ λ¬Έμ œκ°€ λ°œμƒν–ˆλ‹€.

export interface LectureRoomInfo {
  room_name: string;
  room_uid: RoomUID;
}

export interface LectureRoomsPerBuilding {
  building_name: string;
  building_uid: number;
  rooms: LectureRoomInfo[];
}

μ—λŸ¬κ°€ λ°œμƒν•œ μ½”λ“œλŠ” data.room_name data.building_name μ΄μ—ˆλ‹€. "LectureRoomsPerBuilding은 room_name ν”„λ‘œνΌν‹°λ₯Ό ν¬ν•¨ν•˜μ§€ μ•ŠλŠ”λ‹€." "LectureRoomInfoλŠ” building_name ν”„λ‘œνΌν‹°λ₯Ό ν¬ν•¨ν•˜μ§€ μ•ŠλŠ”λ‹€." λΌλŠ” μ—λŸ¬ λ©”μ‹œμ§€λ₯Ό 확인할 수 μžˆμ—ˆλ‹€. or을 μ˜λ―Έν•˜λŠ” | μ—°μ‚°μžλ‘œ 두 νƒ€μž…μ„ μ—°κ²° ν–ˆμœΌλ‹ˆ 두 μΈν„°νŽ˜μ΄μŠ€μ˜ ν”„λ‘œνΌν‹°λ“€μ„ λͺ¨λ‘ μ‚¬μš©ν•  수 μžˆμ„κ±°λΌ μƒκ°ν–ˆλŠ”λ° λ‚΄ μ˜ˆμƒμ΄ ν‹€λ Έμ—ˆλ‹€.

Union Type에 λŒ€ν•΄ κ΅¬κΈ€λ§ν•œ κ²°κ³Ό 이와 κ΄€λ ¨λœ 자료λ₯Ό 찾을 수 μžˆμ—ˆλ‹€.

Union Type μ‚¬μš© μ‹œ 주의점

https://joshua1988.github.io/ts/guide/operator.html#intersection-type

interface Person {
  name: string;
  age: number;
}
interface Developer {
  name: string;
  skill: string;
}
function introduce(someone: Person | Developer) {
  someone.name; // O 정상 λ™μž‘
  someone.age; // X νƒ€μž… 였λ₯˜
  someone.skill; // X νƒ€μž… 였λ₯˜
}

νƒ€μž…μŠ€ν¬λ¦½νŠΈ μž…μž₯μ—μ„œλŠ” introduce ν•¨μˆ˜ μ‹€ν–‰ μ‹œ 인자둜 Person이 올 지, Developerκ°€ 올 지 μ•Œ 수 μ—†λ‹€. λ”°λΌμ„œ λ‘˜ 쀑 μ–΄λŠ νƒ€μž…μ΄ 와도 였λ₯˜κ°€ λ‚˜μ§€ μ•ŠλŠ” λ°©ν–₯으둜 νƒ€μž…μ„ μΆ”λ‘ ν•œλ‹€. κ°€λ Ή 인자둜 Developer νƒ€μž…μ΄ μ˜¨λ‹€λ©΄ someone.age λΌλŠ” μ½”λ“œλŠ” μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚€κΈ° λ•Œλ¬Έμ— νƒ€μž…μŠ€ν¬λ¦½νŠΈκ°€ 미리 μ—λŸ¬λ₯Ό λ„μš°λŠ” 것이닀.

νƒ€μž… κ°€λ“œ

이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„  νƒ€μž… κ°€λ“œλ₯Ό μ΄μš©ν•΄μ•Ό ν•œλ‹€.

νƒ€μž…κ°€λ“œλž€? ν•¨μˆ˜ λ‚΄μ—μ„œ 쑰건문을 μ‚¬μš©ν•΄ νƒ€μž…μ„ μ’νžˆλŠ” 것

function Hello(user: string|number){
  if (typeof user === 'string'){
    // νƒ€μž…μ„ string으둜 μ’νžŒλ‹€
    console.log(`Hello ${user}`);
  }
  console.log(`Hello ${users[user]}`);
}

크게 두 가지 방법이 μžˆλ‹€.

  • typeof: μ›μ‹œ μžλ£Œν˜•λ§Œ ꡬ뢄할 수 μžˆλ‹€.
  • in: 객체에 νŠΉμ • ν”„λ‘œνΌν‹°κ°€ μ‘΄μž¬ν•˜λŠ”μ§€λ₯Ό ν™•μΈν•¨μœΌλ‘œμ¨ νƒ€μž…μ„ μ’νžŒλ‹€.

λ‚˜λŠ” LectureRoomInfo와 LectureRoomsPerBuilding을 ꡬ뢄해야 ν–ˆκΈ° λ•Œλ¬Έμ—, λ‘λ²ˆμ§Έ 방법을 μ‚¬μš©ν–ˆλ‹€.

νƒ€μž… κ°€λ“œλ₯Ό μ μš©ν•œ ν•¨μˆ˜

  const updateLectureRoomChoice = () => {
    if ('room_name' in data) {
      setLectureRoomChoice({
        building_uid: data.building_uid,
        room_uid: data.room_uid,
      });
    }
  };

props data에 room_name ν”„λ‘œνΌν‹°κ°€ μ‘΄μž¬ν•œλ‹€ == dataκ°€ LectureRoomInfo νƒ€μž…μ΄λ‹€. == μ„œλΈŒλ©”λ‰΄μ— ν•΄λ‹Ήν•œλ‹€.

 

μ €λ²ˆ κΈ€μ—μ„œλŠ” 메인메뉴와 μ„œλΈŒλ©”λ‰΄λ₯Ό children props의 μ—¬λΆ€λ‘œ κ΅¬λΆ„ν–ˆμ—ˆλŠ”λ°, μ΄λ ‡κ²Œ νƒ€μž… κ°€λ“œλ₯Ό ν™œμš©ν•΄ ꡬ뢄할 μˆ˜λ„ μžˆμ—ˆλ‹€. λ‹€λ§Œ νƒ€μž… κ°€λ“œμ˜ 경우 jsxμ—μ„œ κ³§λ°”λ‘œ μ‚¬μš©ν•  수 μ—†μœΌλ―€λ‘œ UIμ—μ„œλŠ” children props을, ν•¨μˆ˜ λ‚΄μ—μ„œλŠ” νƒ€μž… κ°€λ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 방식을 택해야겠닀.

 

μœ„ μ˜ˆμ‹œμ²˜λŸΌ data의 ν”„λ‘œνΌν‹°μ— μ ‘κ·Όν•˜λŠ” ν•¨μˆ˜λ“€μ— λͺ¨λ‘ νƒ€μž… κ°€λ“œλ₯Ό μ μš©ν•΄ μ€¬λ”λ‹ˆ μ—λŸ¬κ°€ ν•΄κ²°λ˜μ—ˆλ‹€!