
enum ํ์
์ ๋ค๋ฅธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์๋ ์กด์ฌํ๋ ํ์
์ด์ง๋ง ์๋ฐ์คํฌ๋ฆฝํธ์์๋ ์กด์ฌํ์ง ์๋ ํ์
์ด๋ค. ํ์
์คํฌ๋ฆฝํธ์๋ง ์กด์ฌํ๋ ์ด enum ํค์๋์ ์ฌ์ฉํ๋ enum์ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์๋ณ์๋ค์ ์ค๊ดํธ ์ ์์ ๋ฃ๋ ๊ฒ์ด๋ค. ์ด๊ฑฐํ ํ์
์ ์ด๊ฑฐ ๋ชฉ๋ก์ ์ ๊ณตํ๋ค. ์ด ๋ชฉ๋ก์ ๋ผ๋ฒจ๋ค์ 0๋ถํฐ ์์ํ๋ ์ซ์๋ก ๋ณํ๋๋ฉฐ, ์ฌ๊ธฐ์๋ ์ฝ๋ ๋ด์์ ์์
 ๊ฐ๋ฅํ (์ธ๊ฐ์ด ์ฝ์ ์ ์๋) ๋ผ๋ฒจ๋ก ํํ ๋์ด์๋ค.const person = {
  name: "Maximilian",
  age: 30,
  hobbies: ["Sports", "Cooking"],
  role:,
};role์ 'admin', 'read_only', 'author'๋ฅผ ์ถ๊ฐํ๊ณ ์ ํ๋ค. ๊ฐ๊ฐ์ id๋ 'admin'์์๋ 0์ผ๋ก ์ค์ ํ๊ณ , ์ฝ๊ธฐ ์ ์ฉ 'read_only'์ 1, ๊ทธ๋ฆฌ๊ณ  'author'์ 2๋ก ์ค์ ํ๋ค.const person = {
  name: "Maximilian",
  age: 30,
  hobbies: ["Sports", "Cooking"],
  role: 2, // author
};id์ด๋ค.)์ฒ๋ผ id ์ซ์๋ก ์ ํํ๊ฒ ์ค์ ํ  ์ ์์ ๊ฒ์ด๋ค. ํ์ง๋ง ์ฌ๊ธฐ์ ํ ๊ฐ์ง ๋จ์ ์ด ์๋๋ฐ ๋ฐ๋ก ์ญํ (role)์ด ์์ ์๋ ์๋ ์ซ์๋ฅผ ์ถ๊ฐํ  ์ ์๋ค๋ ๊ฐ๋ฅ์ฑ์ด๋ค. ์ฝ๋๋ฅผ ์์ฑํ๋ฉด์ ๋์ค์์์ผ role์ ์ถ์ถํ๊ณ  if ๊ฒ์ฌ๋ฅผ ์ํํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ  ์ ์๊ฒ ๋๋ค. ๋ํ ๊ฐ๋ฐ์๋ก์ ์ด ์ฌ์ฉ์์ role์ด ๋ฌด์์ผ์ง ๋ฐ๋ก ์ดํดํ๊ธฐ ์ด๋ ค์ธ ๊ฐ๋ฅ์ฑ๋ ์๋ค. 2๊ฐ 'author' ์ธ์ง 'admin' ์ธ์ง๋ฅผ ์ธ์ ๋ ์ธ์ฐ๊ณ  ์์ง๋ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ฐจ๋ผ๋ฆฌ ์ธ๊ฐ์ด ์ฝ์ ์ ์๋ ์๋ณ์๋ก ๊ตฌ๋ถํ๋ ๊ฒ์ด ํจ์ฌ ๋์์ง๋ ๋ชจ๋ฅธ๋ค. ์ด์ฉ๋ฉด ๋ฌธ์์ด ์๋ณ์๋ฅผ ์ฌ์ฉํด๋ณผ ์๋ ์์ ๊ฒ์ด๋ค. ์๋์ ๊ฒฝ์ฐ๋ผ๋ฉด ์ด๋จ๊น?const person = {
  name: "Maximilian",
  age: 30,
  hobbies: ["Sports", "Cooking"],
  role: "READ ONLY USER",
};
...
if (person.role === "READ-ONLY-USER") {
  console.log('is read only');
}const ADMIN = 0;
const READ_ONLY = 1;
const AUTHOR = 2;
const person = {
  name: "Maximilian",
  age: 30,
  hobbies: ["Sports", "Cooking"],
  role: ADMIN,
};role์ ํ์ํ ์์๋ฅผ ๊ฐ์ ธ๋ค ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ด์ฉ๋ฉด ์ฐ๋ฆฌ์๊ฒ ๊ฝค๋ ์ต์ํ ๋ฐฉ๋ฒ์ผ ๊ฒ์ด๋ค.const ADMIN = 0;
const READ_ONLY = 1;
const AUTHOR = 2;
const person = {
  name: "Maximilian",
  age: 30,
  hobbies: ["Sports", "Cooking"],
  role: ADMIN,
};
if (person.role === ADMIN) {
  console.log("is admin");
}enum์ ์์ ๋งํ ํจํด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ  ์ ์๋ ํ์
์ด๋ค.enum Roleenum ํค์๋๋ก enum์ ์์ฑํ๊ณ , ํค์๋๋ ๋๋ฌธ์๋ก ์์ํ๋ Role๋ก ์ง์ ํ๋ค. enum ์ญ์ ์ฌ์ฉ์ ์ง์  ํ์
์ด๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ๋ฐฉ์์ ๋ฐ๋ฅด๋ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ  ์ค๊ดํธ ์์ ์
๋ ฅํ ๋ค,enum Role {
  ADMIN,
  READ_ONLY,
  AUTHOR,
}enum Role {
  ADMIN,
  READ_ONLY,
  AUTHOR,
}
const person = {
  name: "Maximilian",
  age: 30,
  hobbies: ["Sports", "Cooking"],
  role: Role.ADMIN,
};role ์์ Role.ADMIN์ผ๋ก ์ ๊ทผํ์ฌ ๊ฐ์ ์ง์ ํ๋ค.enum Role {
  ADMIN,
  READ_ONLY,
  AUTHOR,
}
const person = {
  name: "Maximilian",
  age: 30,
  hobbies: ["Sports", "Cooking"],
  role: Role.ADMIN,
};
...
if (person.role === Role.AUTHOR) {
  console.log("is author");
}if ๋ฌธ์์ role์ด AUTHOR ์ธ์ง ํ์ธํ๊ณ  ์ฐธ์ด๋ฉด ์ฝ์์ ๋ฌธ์์ด์ ์ถ๋ ฅํ๋๋ก ํ๋ค. ์ง๊ธ๊น์ง ์ด ๋ชจ๋  ์์
์ ๋ผ๋ฒจ์ ์ซ์๋ก ํ ๋นํ๊ฒ ํด์ฃผ๋ enum์ผ๋ก ์ํํด๋ณด์๋ค. ํด๋น ์ฝ๋๋ฅผ ์ปดํ์ผํ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ดํด๋ณด๋ฉด,var Role;
(function (Role) {
  Role[(Role["ADMIN"] = 0)] = "ADMIN";
  Role[(Role["READ_ONLY"] = 1)] = "READ_ONLY";
  Role[(Role["AUTHOR"] = 2)] = "AUTHOR";
})(Role || (Role = {}));
var person = {
  name: "Maximilian",
  age: 30,
  hobbies: ["Sports", "Cooking"],
  role: Role.ADMIN,
};
...
if (person.role === Role.AUTHOR) {
  console.log("is author");
}enum Role {
  ADMIN = 5,
  READ_ONLY = 100,
  AUTHOR = 200,
}enum์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ ๋์์๋ง ๊ตญํ๋์ง ์๋๋ค. ํน์  ์ด์ ๋ก ์ธํด์ ์์ ์ซ์๋ฅผ 0์ผ๋ก ์์ํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ, ์๋ณ์์ ๋ฑํธ๋ฅผ ์ถ๊ฐํ์ฌ ๋ค๋ฅธ ์ซ์๋ฅผ ์
๋ ฅํ  ์๋ ์๋ค. ์์ ๊ฐ์ด 0์ด ์๋๋ผ 5๋ผ๋ฉด ์ด ์์ ๊ฐ ์๋ณ์ ๋ค์์ ๋ค๋ฅธ ์๋ณ์ ๊ฐ์ ์์ ๊ฐ์ผ๋ก๋ถํฐ ์ฆ๊ฐ์์ผ์ ํ ๋นํด์ค์ผ ํ๋ค. ์ด๋ฅผํ
๋ฉด ์ด์ ์ ๊ธฐ๋ณธ ๋์์ด 0, 1, 2 ์๋ค๋ฉด 5๋ก ์์ ๊ฐ์ ํ ๋นํ ์ง๊ธ์ 5, 6, 7์ด ๋๋ ๊ฒ์ด๋ค. ๋ฌผ๋ก  enum์๋ ์ซ์ ๋ฟ๋ง ์๋๋ผ ํ
์คํธ๋ฅผ ํ ๋นํ  ์๋ ์๊ณ , ํผํฉ๋ ๊ฐ๋ฅํ๋ค.enum Role {
  ADMIN = "ADMIN",
  READ_ONLY = 1,
  AUTHOR = "200",
}ADMIN)์ด 0์ด์ง๋ง ๋์์ ๋ค๋ฅธ ์์ผ๋ก ๊ตฌ์ฑํ๊ธฐ ์ํด์  ๋ฌธ์์ด์ ์ด์ด์ ์ซ์๋ฅผ ์
๋ ฅํ  ์๋ ์๊ณ  ๋ค๋ฅธ ๋ฌธ์์ด์ ์
๋ ฅํด๋ ๋๋ค. ์ด๋ ๊ฒ enum์ผ๋ก ์ ์ํ Role์ role ํ์
์ ์ฐธ์กฐํ๊ฑฐ๋, ์ฌ์ฉ์ ์ ์ ํ์
์ ์ฐธ์กฐํ๊ฑฐ๋, ์์ฑํ ์ฌ์ฉ์ ์ ์ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค๋ ์ฅ์ ์ด ์๊ณ  ์ด๊ฒ์ enum์ ๊ฐ์ ์ด๋ผ๊ณ  ํ  ์ ์๋ค. ์ธ๊ฐ์ด ์ฝ์ ์ ์๊ณ  ๋ฐฑ๊ทธ๋ผ์ด๋์ ๋งคํ๋ ๊ฐ์ด ์๋ ์๋ณ์๊ฐ ํ์ํ  ๋ enum์ ๊ฐ์ ์ ์ฐ๋ฆฌ๋ ํ์ฉํ  ์ ์๋ค.any ํ์
์ ํ์
์คํฌ๋ฆฝํธ์์ ํ ๋นํ  ์ ์๋ ๊ฐ์ฅ ์ ์ฐํ ํ์
์ด๋ค. ์ด ํ์
์ ๋ชจ๋  ์ข
๋ฅ์ ๊ฐ์ ์ ์ฅํ๊ณ , ํ์
 ๋ฐฐ์ ๋ ๋ฑํ ํ์ํ์ง ์๋ค. ๊ทธ๋ฆฌ๊ณ  any ํ์
์ ์ฌ์ฉํ๋๋ผ๋ ํ์
์คํฌ๋ฆฝํธ์ ์๋ฌด๋ฐ ๋ฌธ์ ๊ฐ ๋์ง ์๋๋ค.any๋ ์์ฃผ ์ ์ฐํ๊ณ  ํ๋ฅญํ ํ์
์ฒ๋ผ ๋ณด์ด์ง๋ง, ์ด๊ฒ์ด ์ง๋ ํฐ ๋จ์  ๋๋ฌธ์ any๋ฅผ ๊ฐ๋ฅํ ์ฐ์ง ์์์ผ ๊ฒ ๋ค๊ณ  ์๊ฐํ๊ฒ ๋  ๊ฒ์ด๋ค. ์๋ํ๋ฉด ํ์
์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ๊ฐ์ง๊ฒ ๋๋ ๋ชจ๋  ์ฅ์ ์ any๊ฐ ์์์์ผ ๊ทธ์  ๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ  ๋์ ๋ค๋ฅผ ๋ฐ๊ฐ ์๊ฒ ๋๊ธฐ ๋๋ฌธ์ด๋ค. any ๋๋ any ๋ณ์๊ฐ ์ด๋ค ๊ฐ๋ ์ ์ฅํ์ง ์๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ๋ฌ๊ฐ ๊ฒ์ฌํ  ๋ถ๋ถ์ด ์์ด์ง๋ค. ๋ฐ๋ผ์ any๋ฅผ ์ฌ์ฉํด์ผ๋ง ํ๋ ๋ช ๊ฐ์ง ์ด์ ๊ฐ ์์ ๋์๋ง ์ฌ์ฉํด์ผ ํ๋ค. ์ด๋ฅผ ํ
๋ฉด ์ด๋ ํ ๊ฐ์ด๋ ์ข
๋ฅ์ ๋ฐ์ดํฐ๊ฐ ์ด๋์ ์ ์ฅ๋ ์ง ์ ํ ์ ์ ์๋ ๊ฒฝ์ฐ๋ฅผ ๋๋นํ๊ฑฐ๋, ๋ฐํ์ ๊ฒ์ฌ๋ฅผ ์ํํ๋ ๊ฒฝ์ฐ ๋์ค์ ํน์  ๊ฐ์ ์ํ ํ๋ ์์
์ ๋ฒ์๋ฅผ ์ขํ ๋์๋ง ๋ง์ด๋ค. ๊ทธ์ธ์๋ any ํ์
์ ๊ฐ๋ฅํ ์ฌ์ฉํ์ง ์๋ ๊ฒ ์ข๋ค.union ํ์
์ ์ฌ์ฉํด๋ณด๋ ค๊ณ  ํ๋ค.function combine(input1: number, input2: number) {
  const result = input1 + input2;
  return result;
}
const combinedAges = combine(30, 26);
console.log(combinedAges); // 56
const combinedNames = combine("Max", "Anna");
console.log(combinedNames); // error !!!!union ํ์
์ ์ฌ์ฉํด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ  ์ ์๋ค.function combine(input1: number | string, input2: number | string) {
  const result = input1 + input2;
  return result;
}
const combinedAges = combine(30, 26);
console.log(combinedAges); // 56
const combinedNames = combine("Max", "Anna");
console.log(combinedNames); // MaxAnnaunion ํ์
์ ์ฌ์ฉํ์ฌ ํ์
์คํฌ๋ฆฝํธ์์ธ ์ซ์๋ ๋ฌธ์์ด ์ค ํ๋๋ฅผ ์ฌ์ฉํด๋ ๊ด์ฐฎ๋ค๋ ๊ฒ์ ์๋ ค์ผ ํ๋ค. ์ด๋ ์ฐ๋ฆฌ๋ ํ์ดํ ๊ธฐํธ| ์ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ํ์
์ ์
๋ ฅํ๋ฉด ๋๋ค. ์ด์ฒ๋ผ ์์์ ๋ ๊ฐ์ง ์ด์์ ํ์
์ด๋ ํน์ ๊ทธ ์ด์์ ํ์
์ ํ์ํ ๋งํผ ์ฌ์ฉํ  ์ ์๊ฒ ๋๋ค. ํ์ง๋ง ๋ํ๊ธฐ ์ฐ์ฐ์์์๋ '๋ฌธ์์ด'์ด๋ '์ซ์' ํ์
์ ์ ์ฉํ  ์ ์๋ค๋ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค. ๋ฌผ๋ก  ๋ํ๊ธฐ ์ฐ์ฐ์๋ ์ซ์์ ๋ฌธ์์ด ๋ชจ๋ ์ฌ์ฉํ  ์ ์์ผ๋ฏ๋ก ๋ฌธ์ ๊ฐ ์์ด์ผ ํ์ง๋ง, ๋ํ๊ธฐ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ  ์ ์๋ ํ์
๋ ์์ ๊ฒ์ด๋ผ๊ณ  ํ์
์คํฌ๋ฆฝํธ๋ ์ดํดํ๊ณ  ์๋ ๊ฒ์ด๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ๊ฐ๋จํ ๋ฐํ์ ๊ฒ์ฌ๋ฅผ ์ถ๊ฐํ์ฌ ๋งค๊ฐ๋ณ์๊ฐ ์ซ์ ํ์
์ผ ๋์ ๋ฌธ์์ด ํ์
์ผ ๋๋ฅผ ๊ฐ๊ฐ ๋ค๋ฅด๊ฒ ์ฐ์ฐํ์ฌ ๋ฐํํ  ์ ์๋ค.function combine(input1: number | string, input2: number | string) {
  let result;
  // ๋ฐํ์ ๊ฒ์ฌ ์ถ๊ฐ
  if (typeof input1 === "number" && typeof input2 === "number") {
    // number type
    result = input1 + input2;
  } else {
    // string type
    result = input1.toString() + input2.toString();
  }
  return result;
}
const combinedAges = combine(30, 26);
console.log(combinedAges); // 56
const combinedNames = combine("Max", "Anna");
console.log(combinedNames); // MaxAnnaunion ํ์
์ ์ฌ์ฉํ์ฌ ์์
ํ  ๋์ ์ข
์ข
 ํ์ํ ๋ถ๋ถ์ด๋ ๊ธฐ์ตํด๋์.) ์ด์ฒ๋ผ union ํ์
์ ์ฌ์ฉํ๋ฉด ์ฝ๋์ ์ ์ฉํ ๋งค๊ฐ๋ณ์๋ฅผ ๋ณด๋ค ์ ์ฐํ๊ฒ ์ฌ์ฉํ  ์ ์๋ค. ๊ทธ๋ฐ๋ฐ ์ด๋ฅผ ์ฌ์ฉํ์ ๋ ํ์
์ ๋ฐ๋ผ ํจ์ ๋ด์ ๋ค๋ฅธ ๋ก์ง์ ์ ์ฉํ  ์ ์์ผ๋ฏ๋ก ํจ์๊ฐ ์ฌ๋ฌ ์ ํ์ ๊ฐ์ผ๋ก ์๋ํ  ์ ์๊ฒ ๋๋ค. ๋ฌผ๋ก  ํ์
์ ๋ฐ๋ผ ์กฐ๊ธ์ฉ ๋ฌ๋ผ์ง๋ฏ๋ก union ํ์
์ผ๋ก ์์
ํ  ๋ ์์ ๊ฒฝ์ฐ์ฒ๋ผ ์ข
์ข
 ๋ฐํ์ ๊ฒ์ฌ๊ฐ ํ์ํ ๊ฒฝ์ฐ๋ ์๊ณ , ํ๋ก๊ทธ๋จ์ ๋ฐ๋ผ ๋ฐํ์ ๊ฒ์ฌ๋ฅผ ์ํํ์ง ์์๋ union ํ์
์ ์ฌ์ฉํ  ์ ์๋ ๊ฒฝ์ฐ๋ ์๋ค. ๋จ์ง ๊ตฌ์ฑํ๋ ๋ก์ง์ด ์ด๋ค ์์ด๋์ ๋ฐ๋ผ ๋ฌ๋ฆฐ ๋ฌธ์ ์ด๋ค.function combine(
  input1: number | string,
  input2: number | string,
  resultConversion: "as-number" | "as-text" // ํน์  ๋ฌธ์์ด์ union ํ์
์ผ๋ก ์ง์ 
) {
  let result;
  if (
    (typeof input1 === "number" && typeof input2 === "number") ||
    resultConversion === "as-number"
  ) {
    result = +input1 + +input2; // ์๋ฌ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด์ ๋ฏธ๋ฆฌ ์ซ์๋ก ๋ณํํ์ฌ ๋ํด์ค.
  } else {
    result = input1.toString() + input2.toString();
  }
  return result;
}// โก๏ธ
type Combinable = number | string;
type ConversionDescriptor = "as-number" | "as-text";
// โก๏ธ
function combine(
  input1: Combinable,
  input2: Combinable,
  resultConversion: ConversionDescriptor
) {
  let result;
  if (
    (typeof input1 === "number" && typeof input2 === "number") ||
    resultConversion === "as-number"
  ) {
    result = +input1 + +input2;
  } else {
    result = input1.toString() + input2.toString();
  }
  return result;
}type Combinable = number | string;
type ConversionDescriptor = "as-number" | "as-text";type User = { name: string, age: number };
const u1: User = { name: "Max", age: 30 }; // this works!function greet(user: { name: string, age: number }) {
  console.log("Hi, I am " + user.name);
}
function isOlder(user: { name: string, age: number }, checkAge: number) {
  return checkAge > user.age;
}type User = { name: string, age: number };
function greet(user: User) {
  console.log("Hi, I am " + user.name);
}
function isOlder(user: User, checkAge: number) {
  return checkAge > user.age;
}๐จ ํด๋น ํฌ์คํ ์ Udemy์ Typescript :๊ธฐ์ด๋ถํฐ ์ค์ ํ ํ๋ก์ ํธ๊น์ง with React + NodeJS ๊ฐ์๋ฅผ ๋ฒ ์ด์ค๋ก ํ ๊ธฐ๋ก์ ๋๋ค.
โ๐ป ๊ฐ์ git repo ๋ฐ๋ก๊ฐ๊ธฐ