enum์ JavaScript๋ก ์ด๋ป๊ฒ ๋ณํ๋ ๊น?
TypeScript์ enum์ JavaScript์ ์๋ ๊ธฐ๋ฅ์ด๊ธฐ ๋๋ฌธ์, ์ปดํ์ผ ๊ณผ์ ์์ JavaScript๊ฐ ์ดํดํ ์ ์๋ ์ฝ๋๋ก ๋ณํ๋์ด์ผ ํ๋ค. ์ด๋ IIFE๊ฐ ์ฌ์ฉ๋๋ค.
// TypeScript ์ฝ๋
enum WeekDays {
MON = "Mon",
TUES = "Tues",
WEDNES = "Wednes",
THURS = "Thurs",
FRI = "Fri",
}
// JavaScript๋ก ์ปดํ์ผ๋ ๊ฒฐ๊ณผ
var WeekDays;
(function (WeekDays) {
WeekDays["MON"] = "Mon";
WeekDays["TUES"] = "Tues";
WeekDays["WEDNES"] = "Wednes";
WeekDays["THURS"] = "Thurs";
WeekDays["FRI"] = "Fri";
})(WeekDays || (WeekDays = {}));
function (WeekDays) { ... } ์ด๋ผ๋ ์ต๋ช ํจ์๋ฅผ ๋ง๋ค๊ณ ( . . . ) ๋ก ๊ฐ์ผ ๋ค ๋ฐ๋ก (WeekDays || (WeekDays = {})) ์ธ์๋ฅผ ์ ๋ฌํด ์คํํ๋ค. ์ด๊ฒ์ด ๋ฐ๋ก IIFE์ด๋ค.
enum ์ฌ์ฉ์ ์ง์ํด์ผ ํ๋ ์ด์ ๊ฐ ๋ญ๊น?
1. ๋ฒ๋ค ํฌ๊ธฐ ์ฆ๊ฐ
enum ํ ์ค์ด ์ฌ๋ฌ ์ค์ IIFE ์ฝ๋๋ก ๋ฐ๋๊ธฐ ๋๋ฌธ์ ํ๋ก์ ํธ์ enum์ด ๋ง์์ง์๋ก JavaScript ๋ฒ๋ค ํ์ผ์ ์ ์ฒด ํฌ๊ธฐ๊ฐ ๋ถํ์ํ๊ฒ ์ปค์ง๋ค.
2. ํธ๋ฆฌ์์ดํน ๋ฌธ์
๊ฐ์ฅ ์ค์ํ ์ด์ ์ค ํ๋๋ก, enum์ IIFE๋ก ๋ณํ๋๋ฉด์ WeekDays ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ฐ์ ํ ๋นํ๋ ์ฌ์ด๋ ์ดํํธ๊ฐ ์๋ ์ฝ๋๋ก ์ทจ๊ธ๋๋ค. ๋ฒ๋ค๋ฌ๋ ์ด ์ฝ๋๊ฐ ๋ค๋ฅธ ๊ณณ์ ์ํฅ์ ์ค ์ ์๋ค๊ณ ํ๋จํด enum์ ์ผ๋ถ๋ง ์ฌ์ฉํ๋๋ผ๋ enum ์ ์ฒด๋ฅผ ๋ฒ๋ค์์ ์ ๊ฑฐํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
3. const enum์ ํ๊ณ
const enum์ ์ปดํ์ผ ์์ ์ ์ค์ ๊ฐ์ผ๋ก ๋์ฒด๋์ด JavaScript ์ฝ๋๋ฅผ ์ ํ ๋จ๊ธฐ์ง ์๋๋ค.
const enum WeekDays {
MON = "Mon",
TUES = "Tues",
WEDNES = "Wednes",
THURS = "Thurs",
FRI = "Fri",
}
const today = WeekDays.FRI;
var today = "Fri" /* WeekDays.FRI */;
์ด ๋ฐฉ๋ฒ์ ๋ฒ๋ค ํฌ๊ธฐ์ ํธ๋ฆฌ์์ดํน ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ฃผ์ง๋ง, --isolatedModules ์ต์ ๊ณผ ํธํ๋์ง ์๋ ๋ฌธ์ ๋๋ฌธ์ ํ๋์ ์ธ ๊ฐ๋ฐ ํ๊ฒฝ์์๋ ์ฌ์ฉํ๊ธฐ ์ด๋ ต๋ค. ์ต์ ํธ๋์คํ์ผ๋ฌ๋ ํ์ผ์ ๊ฐ๋ณ์ ์ผ๋ก ๋ณํํ๋ค. const enum์ ์ฌ๋ฌ ํ์ผ์ ๊ฑธ์น ํ์ ์ ๋ณด๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์ ์ด ๋ฐฉ์๊ณผ ์ถฉ๋ํ์ฌ ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅํ๋ค.
๋์์ ๋ฌด์์ผ๊น?
์ ๋์จ ํ์ + as const
as const๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ๋ง๋ค๊ณ , ๊ทธ ํ์ ์ ์ถ๋ก ํ์ฌ ์ฌ์ฉํ๋ ๋ฐฉ์์ด๋ค.
const WEEKDAYS = {
MON: "Mon",
TUES: "Tues",
WEDNES: "Wednes",
THURS: "Thurs",
FRI: "Fri",
} as const;
type Weekdays = typeof WEEKDAYS[keyof typeof WEEKDAYS];
function printDay(day: Weekdays) {
console.log(`It's ${day}`);
}
printDay('Mon');
enum๊ณผ ๊ฐ์ IIFE๋ฅผ ์์ฑํ์ง ์๋๋ค. ๊ทธ๋ฅ ์ผ๋ฐ JavaScript ๊ฐ์ฒด์ด๋ค. ๋จ์ํ ๊ฐ์ฒด์ด๋ฏ๋ก ๋ฒ๋ค๋ฌ๊ฐ ์ฌ์ฉ ์ฌ๋ถ๋ฅผ ์ฝ๊ฒ ํ์ ํ๊ณ ์ต์ ํํ ์ ์๋ค.
[์ถ๊ฐ์ ์ผ๋ก ๋ฐฐ์ด ๋ด์ฉ]
IIFE(Immediately Invoked Function Expression): ์ฆ์ ์คํ ํจ์ ํํ
์ ์๋์๋ง์ ์ฆ์ ์คํ๋๋ ํจ์์ด๋ค.
์ฆ์์คํํจ์๋ฅผ ์ฌ์ฉํ๋ ์ฃผ๋ ์ด์
1. ์ ์ญ ์ค์ฝํ ์ค์ผ ๋ฐฉ์ง
IIFE๋ ํจ์๋ฅผ ์ ์ํจ๊ณผ ๋์์ ์คํํ์ฌ ๋ ๋ฆฝ์ ์ธ ๋ด๋ถ ์ค์ฝํ๋ฅผ ์์ฑํ๋ค. ์ด ์ค์ฝํ ์์์ ์ ์ธ๋ ๋ณ์์ ํจ์๋ ์ธ๋ถ์ ๋ ธ์ถ๋์ง ์์ ์ ์ญ ์ค์ฝํ๋ฅผ ์ค์ผ์ํค์ง ์๋๋ค.
let count = 10;
(function() {
let count = 20;
console.log('๋ด๋ถ count:', count); // ๋ด๋ถ count: 20
})();
console.log('์ ์ญ count:', count); // ์ ์ญ count: 10
2. ๋น๊ณต๊ฐ ๋ณ์ ์์ฑ
IIFE๋ ํด๋ก์ ๋ฅผ ๋ง๋๋ ๋ํ์ ์ธ ๋ฐฉ๋ฒ์ด๋ค. IIFE๊ฐ ์คํ๋ ํ์๋ ๋ด๋ถ ํจ์๋ IIFE์ ์ค์ฝํ์ ์ ๊ทผํ ์ ์๊ธฐ ๋๋ฌธ์, ์ธ๋ถ์์ ์ง์ ์์ ํ ์ ์๋ private state๋ฅผ ํ๋ด ๋ผ ์ ์๋ค.
const counter = (function() {
let privateCount = 0; // ๋น๊ณต๊ฐ ๋ณ์๋ก ์ธ๋ถ์์ ์ง์ ์ ๊ทผํ๊ฑฐ๋ ์์ ํ ์ ์๋ค.
return {
increment: function() {
privateCount++;
console.log(privateCount);
},
getCount: function() {
return: privateCount;
}
};
})();
counter.increment();
counter.increment();
console.log(counter.getCount());
// console.log(counter.privateCount); error
3. ์ต์์ async/await ์คํ
์ต์ JavaScript ๊ธฐ๋ฅ์ธ async/await๋ ES ๋ชจ๋ ํ๊ฒฝ์ด ์๋ ์ผ๋ฐ <script> ํ๊ทธ์ ์ต์์ ๋ ๋ฒจ์์๋ ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ค. ์ด๋, async ํค์๋๋ฅผ ๋ถ์ธ IIFE๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ผ์ด ๋ก๋๋๋ ์ฆ์ ๋น๋๊ธฐ ์ฝ๋๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ์คํํ ์ ์๋ค.
(async () => {
try {
const response = await fetch('https://api.example.com/data');
const data = await response.json();
console.log('๋ฐ์ดํฐ ๋ก๋ฉ ์ฑ๊ณต:', data);
} catch (err) {
console.error('์๋ฌ ๋ฐ์:', err);
}
})():
ํธ๋ฆฌ์์ดํน
: ์นํฉ๊ณผ ๊ฐ์ ๋ชจ๋ ๋ฒ๋ค๋ฌ๊ฐ ์ค์ ์ฌ์ฉ๋์ง ์๋ ์ฝ๋๋ฅผ ์ต์ข ๊ฒฐ๊ณผ๋ฌผ์์ ์ ๊ฑฐํ์ฌ ๋น๋ ํ์์ ์ต์ ํํ๋ ๊ธฐ๋ฅ์ด๋ค.
'TypeScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| keyof typeof ์ฌ์ฉ๋ฒ (0) | 2025.08.30 |
|---|---|
| Zod ๋ผ์ด๋ธ๋ฌ๋ฆฌ (0) | 2025.05.08 |
| any์ unknown (0) | 2024.11.27 |
| ํ์ ๋ณ์นญ, ์ธ๋ฑ์ค ์๊ทธ๋์ฒ, ์ด๊ฑฐํ ํ์ (0) | 2024.11.18 |
| ๊ฐ์ฒด (0) | 2024.11.17 |