-
Notifications
You must be signed in to change notification settings - Fork 0
๐ [2์ฅ] enum์ ์ฌ์ฉํด์ผ ํ ๊น?
const metaData: MetadataProps = {
author: "์ข
๋ฏผ",
createdAt: 2024-03-18,
studiedAt: 2024-03-14,
chapter: 2,
description: "enum์ ์ฌ์ฉํด์ผ ํ ๊น?"
}
TypeScript์ย enum
์ ์ฌ์ฉํ์ง ์๋ ํธ์ด ์ข์ ์ด์ : Tree-shaking
์ ๊ด์ ์ ์ค์ฌ์ผ๋ก
- ์ฌ์ฉํ์ง ์๋ ์ฝ๋๋ฅผ ์ญ์ ํ๋ ๊ธฐ๋ฅ
- ๋๋ฌด๋ฅผ ํ๋ค๋ฉด ์ฃฝ์ ์์ฌ๊ท๋ค์ด ๋จ์ด์ง๋ ๋ชจ์ต์ ์ฐฉ์ํด Tree-shaking์ด๋ผ๊ณ ๋ถ๋ฆ
- Tree-shaking์ ๋ฐฉ๋ฒ: exportํ์ง๋ง ์๋ฌด๋ฐ์๋ importํ์ง ์์ ๋ชจ๋์ด๋ ์ฌ์ฉํ์ง ์๋ย ์ฝ๋๋ฅผย
์ญ์
ํด์ ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ์ค์ฌย ํ์ด์ง๊ฐ ํ์๋๋ ์๊ฐ์ ๋จ์ถํ ์ ์์ต๋๋ค.
- ์ด๊ฑฐํ ๋ณ์
- ์ ์๋ฅผ ํ๋๋กย ํฉ์น ๋ย ํธ๋ฆฌํ ๊ธฐ๋ฅ
- ์์์ ์ซ์๋ ๋ฌธ์์ด์ ํ ๋นํ ์ ์์ผ๋ฉฐย ํ๋์ ์ ํ์ผ๋ก ์ฌ์ฉํด์ ๋ฒ๊ทธ๋ฅผ ์ค์ผ ์ ์๋ค.
// ์๋ฌด๊ฒ๋ ์ง์ ํ์ง ์์ ๊ฒฝ์ฐ์๋ 0๋ถํฐ ์ซ์๋ฅผ ๋งค๊น๋๋ค.
enum MOBILE_OS {
IOS, // 0
ANDROID // 1
}
// ์์์ ์ซ์๋ ๋ฌธ์์ด์ ํ ๋นํ ์๋ ์์ต๋๋ค
enum MOBILE_OS {
IOS = 'iOS',
ANDROID = 'Android'
}
// ์๋์ ๊ฐ์ด ์ ํ์ผ๋ก ์ฌ์ฉํ ์๋ ์์ต๋๋ค
const os: MOBILE_OS = MOBILE_OS.IOS
function detectOSType(userAgent: string): MOBILE_OS {
// ์๋ต
}
enum
์ TypeScript๊ฐ ์์ฒด์ ์ผ๋ก ๊ตฌํํ๋ ๊ธฐ๋ฅ์
๋๋ค.ย JavaScript์์๋ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ย ์๋์ ๊ฐ์ดย ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋๋ฅผ ์์ฃผ ์์ฑํ๊ฒ ๋ฉ๋๋ค.
const MOBILE_OS = {
IOS: 'iOS',
ANDROID: 'Android'
}
console.log(MOBILE_OS.IOS) // iOS
enum
์ ํธ๋ฆฌํ ๊ธฐ๋ฅ์ด์ง๋ง TypeScript๊ฐ ์์ฒด์ ์ผ๋ก ๊ตฌํํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ๋ ๋ฌธ์ ๊ฐ ์๋ค. ์๋์ ๊ฐ์ด TypeScript ์ฝ๋๋ฅผ ์์ฑํ ๊ฒฝ์ฐ๋ฅผ ์์๋ก ์ดํด๋ณด์.
export enum MOBILE_OS {
IOS,
ANDROID
}
// ๋ฌธ์์ด์ ํ ๋นํ ๊ฒฝ์ฐ
export enum MOBILE_OS {
IOS = 'iOS',
ANDROID = 'Android'
}
์ ์ฝ๋๋ฅผ ํธ๋์คํ์ผํ๋ฉด ์๋์ ๊ฐ์ JavaScript ์ฝ๋๊ฐ ๋๋ค.
export var MOBILE_OS;
(function (MOBILE_OS) {
MOBILE_OS[MOBILE_OS["IOS"] = 0] = "IOS";
MOBILE_OS[MOBILE_OS["ANDROID"] = 1] = "ANDROID";
})(MOBILE_OS || (MOBILE_OS = {}));
// ๋ฌธ์์ด์ ํ ๋นํ ๊ฒฝ์ฐ
export var MOBILE_OS;
(function (MOBILE_OS) {
MOBILE_OS["IOS"] = "iOS";
MOBILE_OS["ANDROID"] = "Android";
})(MOBILE_OS || (MOBILE_OS = {}));
JavaScript์ ์กด์ฌํ์ง ์๋ ๊ฒ์ ๊ตฌํํ๊ธฐ ์ํด TypeScriptย ์ปดํ์ผ๋ฌ๋ IIFE(์ฆ์ ์คํ ํจ์)๋ฅผย ํฌํจํ ์ฝ๋๋ฅผ ์์ฑํ๋ค. ๊ทธ๋ฐ๋ฐย [Rollup](https://rollupjs.org/guide/en/)๊ณผ ๊ฐ์ ๋ฒ๋ค๋ฌ๋ IIFE๋ฅผ '์ฌ์ฉํ์ง ์๋ ์ฝ๋'๋ผ๊ณ ํ๋จํ ์ ์์ด์ย Tree-shaking์ด ๋์ง ์๋๋ค. ๊ฒฐ๊ตญย MOBILE_OS
๋ฅผ importํ๊ณ ์ค์ ๋ก๋ ์ฌ์ฉํ์ง ์๋๋ผ๋ ์ต์ข
๋ฒ๋ค์๋ ํฌํจ์ด ๋๋ ๊ฒ์ด๋ค.
-
Union
Types๋ฅผ ์ฌ์ฉํ์. ์๋๋ ์์ ์ฝ๋์ด๋ค.(์ดํ๋กย ๋ฌธ์์ด์ ํ ๋นํยenum
๋ง ์๊ฐ).
const MOBILE_OS = {
IOS: 'iOS',
Android: 'Android'
} as const;
type MOBILE_OS = typeof MOBILE_OS[keyof typeof MOBILE_OS]; // 'iOS' | 'Android'
์ ์ฝ๋๋ ์๋์ ๊ฐ์ JavaScript ์ฝ๋๋ก ํธ๋์คํ์ผ๋๋ค.
const MOBILE_OS = {
IOS: 'iOS',
Android: 'Android'
};
TypeScript ์ฝ๋์์๋ย MOBILE_OS
ย ํ์
์ ์ ์ํ ์ด์ ์ ๊ทธ๋๋ก ๋๋ฆฌ๋ฉด์, JavaScript๋ก ํธ๋์คํ์ผํด๋ IIFE๊ฐ ์์ฑ๋์ง ์์ผ๋ฏ๋ก Tree-shaking
์ ํ ์ ์๋ค.
์ง๊ธ๊น์ง JavaScript ๊ฐ์ฒด๋กย enum
ย ๊ฐ์ ๊ฒ์ ํํํ ๊ฒฝ์ฐ, ํธ๋์คํ์ผ๋ JavaScript์์๋ ๋ณ๋ค๋ฅธ ์ฐจ์ด ์์ด ์ ํ์ผ๋ก ์ฌ์ฉํ๋ ์ด์ ์ ๋๋ฆด ์ ์๋ ๊ฒ๋ ์ฅ์ ์ด๋ค.
- TypeScript์์ย
const enum
์ ์ฌ์ฉํด ๋ณด๋ฉดยenum
๊ณผ ๊ฑฐ์ ๊ฐ๋ค๊ณ ๋๊ปด์ง๋ค. -
enum
์ ๋ด์ฉ์ด ํธ๋์คํ์ผํ ๋์ธ๋ผ์ธ์ผ๋ก ํ์ฅ๋๋ค
๋ ์ ์ด ์ฐจ์ด์ ์ด๋ค.
const enum MOBILE_OS {
IOS = 'iOS',
ANDROID = 'Android',
}
const ios = MOBILE_OS.IOS
์ ์ฝ๋๋ ์๋์ ๊ฐ์ JavaScript ์ฝ๋๋ก ํธ๋์คํ์ผ๋๋ค.
const ios = "iOS" /* IOS */;
-
Tree-shaking
์ด๋ผ๋ ๊ด์ ์์๋ Union Types์ ๋์ผํ๋ค. ์ฌ์ฉํ์ง ์๋๋ค๋ฉด ๋ฒ๋ค์ ํฌํจ๋์ง ์๋๋ค.
- ํ์ง๋ง
๊ธด ๋ฌธ์์ด
์ ํ ๋นํ๋ ๊ฒฝ์ฐ์๋ Union types์ ๋น๊ตํด ๋ค์ ๋ถ๋ฆฌํ ์ ์ด ์๋ค๊ณ ์๊ฐ๋๋ค.
// TypeScript
const enum NAME {
JUGEM = 'ๅฏฟ้็กๅฏฟ้็กไบๅซใฎๆฆใๅใๆตท็ ๅฉๆฐด้ญใฎโฆ', // ์ผ๋ณธ์์ '๊น์ํ๋ฌด ๊ฑฐ๋ถ์ด์ ๋๋ฃจ๋ฏธ ์ผ์ฒ๊ฐ์ ๋๋ฐฉ์ญ...'๊ณผ ๋น์ทํ ์ฉ๋๋ก ์ฌ์ฉํ๋ ๊ธด ์ด๋ฆ์
๋๋ค.
TARO = '๋ค๋ก',
JIRO = '์ง๋ก',
}
const isJugem = name === NAME.JUGEM
// JavaScript ํธ๋์คํ์ผ ํ
const isJugem = name === "u5BFFu9650u7121u5BFFu9650u7121u4E94u52ABu306Eu64E6u308Au5207u308Cu6D77u7802u5229u6C34u9B5Au306Eu2026" /* JUGEM */;
- ํย
const enum
์ Babel๋ก ํธ๋์คํ์ผํ ์ ์๊ณ , TypeScript์ย--isolatedModules
๊ฐ ํ์ฑํ๋ ํ๊ฒฝ์์๋ ํฐ ์๋ฏธ๊ฐ ์๋ค.- ๋ ์์ธํ ๋ด์ฉ์ย [Kabuku ๋์ Developers Blog(์ผ๋ณธ์ด)](https://www.kabuku.co.jp/developers/good-bye-typescript-enum)์โฆ.~
Tree-shaking ๊ด์ ์์ ๋ณด์์ ๋ ์๋์ ๊ฐ์ ์์๋ก ์ฌ์ฉํ๊ธฐ๋ฅผ ์ถ์ฒ
Union Types
>const enum
>enum
- [Feature] make generated codes from enum could be minified when not usedhttps://github.com/microsoft/TypeScript/issues/27604
- ์๋ , TypeScript enum | Kabuku Developersย Blog(์ผ๋ณธ์ด)https://www.kabuku.co.jp/developers/good-bye-typescript-enum
โจ๐ ๋ฌธ์ ๋ชจ์ ๐โจ
๐ [2์ฅ] enum์ ์ฌ์ฉํด์ผ ํ ๊น?
๐ [2์ฅ] ํ์
์งํฉ์ ๊ฐ๋
๊ณผ ํ์
ํธํ์ฑ
๐ [2์ฅ] ๋งต๋ ํ์
์ด ๋ญ๊น?
๐ [2์ฅ] Type๊ณผ Interface๋ ๊ฐ๊ฐ ์ธ์ ์ฌ์ฉํ๋ ๊ฑธ๊น? ์ ๋ํ ์๊ฒฌ
๐ [3์ฅ] ์ธ๋ฑ์ค๋ ์์ธ์ค ํ์
์์ ์ค๋ฅ ์ ๋ณด~!
๐ [4์ฅ] ํ์
์ขํ๊ธฐ์ ๋ฐฉ์(ํ์
๊ฐ๋vs ํ์
๋จ์ธ)