<aside> 💡 목차

</aside>

1. 유니온 타입

function unionGeneric<T extends string | number>(value: T) {
  if (typeof value === 'string') {
    return value.toLowerCase();
  }
  return value; // string | number
}

const result1 = unionGeneric('STring');
const result2 = unionGeneric(1000);
console.log(result1, result2); // string 1000

2. 제네릭 유틸리티 타입

2-1) Partial: 모든 속성을 선택적으로 만들어줌

interface User {
  name: string;
  age: number;
}
const users: { [key: number]: User } = {
  1: { name: '테드', age: 30 },
  2: { name: '챨리', age: 29 },
};
function updateUser(id: number, changes: Partial<User>) {
  const user = users[id]; // User 타입의 객체

  if (!user) {
    console.log(`User with id ${id} not found`);
  }
  //   변경 사항 적용
  //   : 스프레드 연산자를 사용하여 해당 유저의 전체 데이터를 불러와
  //   : changes 객체에 담긴 속성의 값을 새로고침(업데이트)
  //   - 객체의 경우 키의 값이 중복되는 경우 뒤의 속성값으로 업데이트
  users[id] = { ...user, ...changes };
}

updateUser(1, { name: 'TED' });
updateUser(2, { age: 34 });
updateUser(3, { name: 'Micheal', age: 55 }); // User with id 3 not found
console.log(users[1]); // { name: 'TED', age: 30 }
console.log(users[2]); // { name: '챨리', age: 34 }
console.log(users[3]); // { name: 'Micheal', age: 55 }
// 없던 인덱스에 정보를 넣어서 새로운 객체가 생성 되었음
users[4] = { name: '안녕', age: 5 };
console.log(users[4]);

2-2) Readonly: 모든 속성을 읽기 전용 속성을 변경