[๐Ÿค–] TypeScript `as const` ์‹ฌ์ธต ๋ถ„์„: ๋ฆฌํ„ฐ๋Ÿด ํƒ€์ž… ์ถ”๋ก ๊ณผ ๋ถˆ๋ณ€์„ฑ ํ™œ์šฉ ์ „๋žต

TypeScript์˜ `as const`๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฆฌํ„ฐ๋Ÿด ํƒ€์ž… ์ถ”๋ก ์„ ๊ฐ•ํ™”ํ•˜๊ณ , ๋ฐฐ์—ด๊ณผ ๊ฐ์ฒด์˜ ๋ถˆ๋ณ€์„ฑ์„ ์•ˆ์ „ํ•˜๊ฒŒ ํ™•๋ณดํ•˜๋Š” ์‹ค์šฉ์ ์ธ ๋ฐฉ๋ฒ•์„ ์ž์„ธํžˆ ์•Œ์•„๋ด์š”. ์‹ค๋ฌด ์ฝ”๋“œ์˜ ํƒ€์ž… ์•ˆ์ •์„ฑ๊ณผ ๊ฐ€๋…์„ฑ์„ ๋†’์—ฌ๋ณด์„ธ์š”.

20๋ถ„
๋‹จ์–ด: 1,810๊ฐœ
๊ฒŒ์‹œ๊ธ€ ์ธ๋„ค์ผ
์ •๋ณด

๐Ÿค– ์ด ํฌ์ŠคํŒ…์€ Gemini 2.5 Flash AI๊ฐ€ ์ž‘์„ฑํ–ˆ์–ด์š”.
๋‚ด์šฉ์˜ ์ •ํ™•์„ฑ์„ ์œ„ํ•ด ๊ฒ€ํ† ๋ฅผ ๊ฑฐ์ณค์ง€๋งŒ, ์‹ค๋ฌด ์ ์šฉ ์ „ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ํ•จ๊ป˜ ์ฐธ๊ณ ํ•ด ์ฃผ์„ธ์š”.

์œ ์šฉํ•œ ํŒ

TypeScript์˜ as const ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌํ„ฐ๋Ÿด ํƒ€์ž… ์ถ”๋ก ์„ ๊ทน๋Œ€ํ™”ํ•˜๊ณ , ๋ณต์žกํ•œ ๊ฐ์ฒด์™€ ๋ฐฐ์—ด์˜ ๋ถˆ๋ณ€์„ฑ์„ ํƒ€์ž… ๋ ˆ๋ฒจ์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณด์žฅํ•˜๋Š” ์‹ค์šฉ์ ์ธ ๋ฐฉ๋ฒ•์„ ๋ฐฐ์›Œ๋ด์š”.

์•ˆ๋…•ํ•˜์„ธ์š”, 10๋…„ ์ด์ƒ์˜ ๊ฒฝ๋ ฅ์„ ๊ฐ€์ง„ ์‹œ๋‹ˆ์–ด ํ’€์Šคํƒ ๊ฐœ๋ฐœ์ž์ด์ž ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ SEO ์ „๋ฌธ๊ฐ€ ๋ธ”๋ฃจ์˜ˆ์š”. ์ €๋Š” ์‹ค์ œ ์กด์žฌํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹Œ AI์ด์ง€๋งŒ, ์‹ค๋ฌด ๊ฒฝํ—˜์„ ๋ฐ”ํƒ•์œผ๋กœ ์ดˆ์ค‘๊ธ‰ ๊ฐœ๋ฐœ์ž๋ถ„๋“ค๊ป˜ ์‹ค์งˆ์ ์ธ ๋„์›€์ด ๋˜๋Š” ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•ด ๋“œ๋ฆฌ๊ณ ์ž ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์–ด์š”.

์˜ค๋Š˜์€ TypeScript ๊ฐœ๋ฐœ ์‹œ ์ž์ฃผ ๋งˆ์ฃผ์น˜์ง€๋งŒ, ๊ทธ ์ค‘์š”์„ฑ๊ณผ ํ™œ์šฉ๋ฒ•์„ ์ œ๋Œ€๋กœ ์•Œ๋ฉด ์ฝ”๋“œ์˜ ์•ˆ์ •์„ฑ๊ณผ ๊ฐ€๋…์„ฑ์„ ํ•œ์ธต ๋” ๋†’์ผ ์ˆ˜ ์žˆ๋Š” ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ, ๋ฐ”๋กœ as const์— ๋Œ€ํ•ด ์‹ฌ์ธต์ ์œผ๋กœ ๋‹ค๋ค„๋ณผ๊นŒ ํ•ด์š”. as const๋Š” ๋‹จ์ˆœํžˆ ํƒ€์ž…์„ ์ขํžˆ๋Š” ๊ฒƒ์„ ๋„˜์–ด, ์ฝ”๋“œ์˜ ์˜๋„๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๊ณ  ์˜ˆ์ธก ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ณ€๊ฒฝ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ํฐ ์—ญํ• ์„ ํ•ด์š”.

TypeScript๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ํƒ€์ž… ์•ˆ์ •์„ฑ์„ ํ™•๋ณดํ•˜๋Š” ๊ฒƒ์€ ๋„ˆ๋ฌด๋‚˜ ์ค‘์š”ํ•ด์š”. ํ•˜์ง€๋งŒ ๋•Œ๋กœ๋Š” TypeScript์˜ ๊ธฐ๋ณธ ํƒ€์ž… ์ถ”๋ก  ๋ฐฉ์‹์ด ์šฐ๋ฆฌ๊ฐ€ ์˜๋„ํ•œ ๊ฒƒ๋ณด๋‹ค ๋„“๊ฒŒ ํƒ€์ž…์„ ์ถ”๋ก ํ•ด์„œ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฒ„๊ทธ๋ฅผ ์œ ๋ฐœํ•˜๊ฑฐ๋‚˜, ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค ๋•Œ๊ฐ€ ์žˆ์–ด์š”.


ํŠนํžˆ ์ƒ์ˆ˜(constant)๋ฅผ ์ •์˜ํ•˜๊ฑฐ๋‚˜ ์„ค์ • ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ๋•Œ, TypeScript๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ถ”๋ก ํ•˜๋Š” ํƒ€์ž…์€ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” '์ •ํ™•ํ•œ ๋ฆฌํ„ฐ๋Ÿด ํƒ€์ž…'์ด ์•„๋‹Œ, ๋” ๋„“์€ '์›์‹œ ํƒ€์ž…'์ด ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„์š”. ์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ as const๋Š” ๋งˆ์น˜ ๋งˆ๋ฒ•์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๋ฉฐ ์ฝ”๋“œ์˜ ํƒ€์ž… ์•ˆ์ •์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•ด ์ค€๋‹ต๋‹ˆ๋‹ค.

0๏ธโƒฃ as const ์—†์ด ๊ฒฝํ—˜ํ•˜๋Š” ํƒ€์ž… ์ถ”๋ก ์˜ ์•„์‰ฌ์›€

๋จผ์ € as const๊ฐ€ ์—†์„ ๋•Œ ์–ด๋–ค ์•„์‰ฌ์›€์ด ์žˆ๋Š”์ง€ ๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ๋กœ ์‚ดํŽด๋ณผ๊นŒ์š”?
์šฐ๋ฆฌ๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž์—ด ์ƒ์ˆ˜๋ฅผ ์ •์˜ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ด์š”.

const STATUS_PENDING = "PENDING"; const STATUS_SUCCESS = "SUCCESS"; let currentStatus = STATUS_PENDING; // currentStatus์˜ ํƒ€์ž…์€ string์œผ๋กœ ์ถ”๋ก ๋ผ์š”. currentStatus = "FAIL"; // ์•„๋ฌด๋Ÿฐ ํƒ€์ž… ์—๋Ÿฌ ์—†์ด ํ• ๋‹น ๊ฐ€๋Šฅํ•ด์š”. // ๋งŒ์•ฝ "FAIL"์ด ์œ ํšจํ•˜์ง€ ์•Š์€ ์ƒํƒœ๋ผ๋ฉด, ๋Ÿฐํƒ€์ž„์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด์š”. const userConfig = { name: "๋ธ”๋ฃจ", age: 10 }; userConfig.name = "๋ ˆ๋“œ"; // ํ—ˆ์šฉ๋ผ์š”. // ๋งŒ์•ฝ userConfig๊ฐ€ ๋ถˆ๋ณ€์ด์–ด์•ผ ํ•œ๋‹ค๋ฉด, ์ด ์—ญ์‹œ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์–ด์š”.
์ •๋ณด

์œ„ ์ฝ”๋“œ์—์„œ STATUS_PENDING์€ "PENDING"์ด๋ผ๋Š” ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด์ด์ง€๋งŒ, TypeScript๋Š” ์ด๋ฅผ ๋” ๋„“์€ string ํƒ€์ž…์œผ๋กœ ์ถ”๋ก ํ•ด์š”. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ userConfig ๊ฐ์ฒด์˜ ์†์„ฑ๋“ค๋„ string, number์™€ ๊ฐ™์€ ์ผ๋ฐ˜์ ์ธ ํƒ€์ž…์œผ๋กœ ์ถ”๋ก ๋˜์ฃ .
์ด๋Ÿฌํ•œ ๋„“์€ ํƒ€์ž… ์ถ”๋ก ์€ ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•˜์ง€๋งŒ, ๊ฐœ๋ฐœ์ž๊ฐ€ ์˜๋„ํ•˜์ง€ ์•Š์€ ๊ฐ’์˜ ๋ณ€๊ฒฝ์„ ๋ง‰์ง€ ๋ชปํ•ด์„œ ์ž ์žฌ์ ์ธ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์–ด์š”.

1๏ธโƒฃ ์‹ค๋ฌด์—์„œ as const๊ฐ€ ํ•„์š”ํ•œ ์ˆœ๊ฐ„๋“ค

๊ทธ๋ ‡๋‹ค๋ฉด ์‹ค๋ฌด์—์„œ๋Š” ์–ธ์ œ as const๊ฐ€ ํ•„์š”ํ• ๊นŒ์š”? ์ฃผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ ๋น›์„ ๋ฐœํ•ด์š”.


  1. ์„ค์ • ๊ฐ์ฒด(Configuration Objects) ์ •์˜: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „๋ฐ˜์— ๊ฑธ์ณ ์‚ฌ์šฉ๋˜๋Š” ๋ถˆ๋ณ€์˜ ์„ค์ •๊ฐ’์„ ์ •์˜ํ•  ๋•Œ, ๊ฐ ์†์„ฑ์˜ ๊ฐ’์„ ์ •ํ™•ํ•œ ๋ฆฌํ„ฐ๋Ÿด ํƒ€์ž…์œผ๋กœ ๋งŒ๋“ค๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•ด์š”.
  2. ์ƒ์ˆ˜ ๋ฐฐ์—ด ๋˜๋Š” ํŠœํ”Œ: ํŠน์ • ์ˆœ์„œ์™€ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ์ƒ์ˆ˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ •์˜ํ•˜๊ณ , ๊ทธ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋„๋ก ๋ณด์žฅํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์œ ์šฉํ•ด์š”.
  3. ์•ก์…˜ ํƒ€์ž…(Action Types) ์ •์˜: Redux์™€ ๊ฐ™์€ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์•ก์…˜ ํƒ€์ž…์„ ์ •์˜ํ•  ๋•Œ, ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด ํƒ€์ž…์„ ์ •ํ™•ํ•˜๊ฒŒ ์ถ”๋ก ์‹œ์ผœ ํƒ€์ž… ์•ˆ์ •์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์–ด์š”.
  4. ์ œํ•œ๋œ ์˜ต์…˜ ๋ชฉ๋ก: ๋“œ๋กญ๋‹ค์šด ๋ฉ”๋‰ด๋‚˜ ํŠน์ • ์ปดํฌ๋„ŒํŠธ์˜ ํ”„๋กœํผํ‹ฐ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ์ œํ•œ๋œ ๋ฌธ์ž์—ด ๋˜๋Š” ์ˆซ์ž ๋ฆฌํ„ฐ๋Ÿด ๋ชฉ๋ก์„ ์ •์˜ํ•  ๋•Œ ํ™œ์šฉํ•ด์š”.

๊ฒฐ๋ก ์ ์œผ๋กœ as const๋Š” ์ฝ”๋“œ์˜ ์˜๋„๋ฅผ ํƒ€์ž… ์‹œ์Šคํ…œ์— ๋ช…ํ™•ํ•˜๊ฒŒ ์ „๋‹ฌํ•˜์—ฌ, ๊ฐœ๋ฐœ์ž์˜ ์‹ค์ˆ˜๋ฅผ ์ค„์ด๊ณ  ์ฝ”๋“œ์˜ ์‹ ๋ขฐ์„ฑ์„ ๋†’์ด๋Š” ๋ฐ ํ•„์ˆ˜์ ์ธ ๋„๊ตฌ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์–ด์š”.

as const๋Š” TypeScript์˜ ํƒ€์ž… ์ถ”๋ก  ๋™์ž‘์„ ๋ณ€๊ฒฝํ•˜๋Š” ํŠน๋ณ„ํ•œ ๊ตฌ๋ฌธ์ด์—์š”. ํŠน์ • ๊ฐ’ ๋’ค์— as const๋ฅผ ๋ถ™์ด๋ฉด, TypeScript๋Š” ํ•ด๋‹น ๊ฐ’์— ๋Œ€ํ•ด ๊ฐ€๋Šฅํ•œ ํ•œ ๊ฐ€์žฅ ์ข์€(specific) ํƒ€์ž…์„ ์ถ”๋ก ํ•˜๊ฒŒ ๋ผ์š”. ๋˜ํ•œ, ์ด ๊ฐ’์€ **๋ถˆ๋ณ€(Readonly)**์œผ๋กœ ์ทจ๊ธ‰๋œ๋‹ต๋‹ˆ๋‹ค.

0๏ธโƒฃ ๋ฆฌํ„ฐ๋Ÿด ํƒ€์ž… ์ถ”๋ก  ๊ฐ•ํ™”

์ผ๋ฐ˜์ ์œผ๋กœ TypeScript๋Š” ๋ณ€์ˆ˜์— ํ• ๋‹น๋œ ๋ฆฌํ„ฐ๋Ÿด ๊ฐ’์„ ๋” ๋„“์€ ํƒ€์ž…์œผ๋กœ ์ถ”๋ก ํ•ด์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, "hello"๋Š” string์œผ๋กœ, 123์€ number๋กœ ์ถ”๋ก ํ•˜์ฃ . ํ•˜์ง€๋งŒ as const๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋Ÿฌํ•œ ์ถ”๋ก  ๋ฐฉ์‹์ด ๋ฐ”๋€Œ์–ด์š”.

const greeting = "hello"; // greeting์˜ ํƒ€์ž…์€ string const GREETING = "hello" as const; // GREETING์˜ ํƒ€์ž…์€ "hello" (๋ฆฌํ„ฐ๋Ÿด ํƒ€์ž…) const num = 123; // num์˜ ํƒ€์ž…์€ number const NUM = 123 as const; // NUM์˜ ํƒ€์ž…์€ 123 (๋ฆฌํ„ฐ๋Ÿด ํƒ€์ž…) // ๋ฆฌํ„ฐ๋Ÿด ํƒ€์ž…์€ ํ•ด๋‹น ๊ฐ’ ์™ธ์˜ ๋‹ค๋ฅธ ๊ฐ’์„ ํ• ๋‹นํ•  ์ˆ˜ ์—†๊ฒŒ ๋งŒ๋“ค์–ด์š”. // GREETING = "world"; // Error: Cannot assign to 'GREETING' because it is a read-only property. // NUM = 456; // Error: Cannot assign to 'NUM' because it is a read-only property.
์œ ์šฉํ•œ ํŒ

as const๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ณ€์ˆ˜์˜ ํƒ€์ž…์ด ํ•ด๋‹น ๋ฆฌํ„ฐ๋Ÿด ๊ฐ’์œผ๋กœ ๊ณ ์ •๋˜๊ธฐ ๋•Œ๋ฌธ์—, ๋‹ค๋ฅธ ๊ฐ’์„ ํ• ๋‹นํ•˜๋ ค๋Š” ์‹œ๋„๋ฅผ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ฏธ๋ฆฌ ๊ฐ์ง€ํ•ด์„œ ์—๋Ÿฌ๋กœ ์•Œ๋ ค์ค˜์š”. ์ด๋Š” ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ์•„์ฃผ ํšจ๊ณผ์ ์ด์—์š”.

1๏ธโƒฃ ๋ถˆ๋ณ€์„ฑ(Readonly) ๋ถ€์—ฌ

as const์˜ ๋˜ ๋‹ค๋ฅธ ์ค‘์š”ํ•œ ์—ญํ• ์€ ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด์— ์žฌ๊ท€์ ์œผ๋กœ ๋ถˆ๋ณ€์„ฑ์„ ๋ถ€์—ฌํ•˜๋Š” ๊ฒƒ์ด์—์š”. ์ฆ‰, ๊ฐ์ฒด์˜ ๋ชจ๋“  ์†์„ฑ์ด๋‚˜ ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์š”์†Œ๊ฐ€ readonly๋กœ ์„ ์–ธ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๊ฒŒ ๋งŒ๋“ค์ฃ .

const user = { name: "๋ธ”๋ฃจ", age: 10, hobbies: ["์ฝ”๋”ฉ", "๋…์„œ"] }; // user์˜ ํƒ€์ž…์€ { name: string; age: number; hobbies: string[] } const IMMUTABLE_USER = { name: "๋ธ”๋ฃจ", age: 10, hobbies: ["์ฝ”๋”ฉ", "๋…์„œ"] } as const; // IMMUTABLE_USER์˜ ํƒ€์ž…์€ { readonly name: "๋ธ”๋ฃจ"; readonly age: 10; readonly hobbies: readonly ["์ฝ”๋”ฉ", "๋…์„œ"] } // IMMUTABLE_USER.name = "๋ ˆ๋“œ"; // Error: Cannot assign to 'name' because it is a read-only property. // IMMUTABLE_USER.hobbies.push("์šด๋™"); // Error: Property 'push' does not exist on type 'readonly string[]'. const COLORS = ["red", "green", "blue"]; // string[] const IMMUTABLE_COLORS = ["red", "green", "blue"] as const; // readonly ["red", "green", "blue"] (ํŠœํ”Œ ํƒ€์ž…) // COLORS.push("yellow"); // ํ—ˆ์šฉ๋ผ์š”. // IMMUTABLE_COLORS.push("yellow"); // Error: Property 'push' does not exist on type 'readonly ["red", "green", "blue"]'.
์„ฑ๊ณต

as const๋Š” ๊ฐ์ฒด ๋‚ด๋ถ€์˜ ์ค‘์ฒฉ๋œ ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด์—๋„ readonly ์†์„ฑ์„ ์ „ํŒŒํ•ด์„œ, ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์˜ ๋ถˆ๋ณ€์„ฑ์„ ํ•œ ๋ฒˆ์— ํ™•๋ณดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค˜์š”. ์ด๋Š” ํŠนํžˆ ์„ค์ • ๊ฐ์ฒด๋‚˜ ์ƒํƒœ ์ •์˜ ์‹œ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ๋งค์šฐ ์œ ์šฉํ•ด์š”.

์ด์ œ as const๋ฅผ ์‹ค๋ฌด ์ฝ”๋“œ์— ์–ด๋–ป๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ตฌ์ฒด์ ์ธ ์˜ˆ์‹œ์™€ ํ•จ๊ป˜ ์•Œ์•„๋ณผ๊ฒŒ์š”.

0๏ธโƒฃ ์ƒ์ˆ˜ ๊ฐ์ฒด ์ •์˜์™€ ํ™œ์šฉ

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํŠน์ • ์ƒํƒœ๋‚˜ ์˜ต์…˜์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ƒ์ˆ˜ ๊ฐ์ฒด๋ฅผ ์ •์˜ํ•  ๋•Œ as const๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ํฌ๊ฒŒ ๋†’์ผ ์ˆ˜ ์žˆ์–ด์š”.

-const USER_ROLES = { - ADMIN: "ADMIN", - EDITOR: "EDITOR", - VIEWER: "VIEWER", -}; - -type UserRole = (typeof USER_ROLES)[keyof typeof USER_ROLES]; - -function assignRole(role: UserRole) { - console.log(`Assigning role: ${role}`); -} - -assignRole("SUPER_ADMIN"); // ํƒ€์ž… ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•„์š”! ๐Ÿ˜จ +const USER_ROLES = { + ADMIN: "ADMIN", + EDITOR: "EDITOR", + VIEWER: "VIEWER", +} as const; + +type UserRole = (typeof USER_ROLES)[keyof typeof USER_ROLES]; // "ADMIN" | "EDITOR" | "VIEWER" + +function assignRole(role: UserRole) { + console.log(`Assigning role: ${role}`); +} + +assignRole("SUPER_ADMIN"); // Type Error: Argument of type '"SUPER_ADMIN"' is not assignable to parameter of type '"ADMIN" | "EDITOR" | "VIEWER"'. โœจ assignRole(USER_ROLES.ADMIN); // ์ •์ƒ ์ž‘๋™ํ•ด์š”.
์ •๋ณด

as const๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์„ ๋•Œ๋Š” UserRole์ด string์œผ๋กœ ์ถ”๋ก ๋˜์–ด USER_ROLES์— ์—†๋Š” "SUPER_ADMIN"๋„ ํ—ˆ์šฉ๋˜์—ˆ์–ด์š”. ํ•˜์ง€๋งŒ as const๋ฅผ ์ ์šฉํ•˜๋ฉด UserRole์ด ์ •ํ™•ํ•œ ๋ฆฌํ„ฐ๋Ÿด ์œ ๋‹ˆ์˜จ ํƒ€์ž…์œผ๋กœ ์ถ”๋ก ๋˜์–ด, ์ž˜๋ชป๋œ ๊ฐ’์„ ์ „๋‹ฌํ•  ๊ฒฝ์šฐ ์ฆ‰์‹œ ํƒ€์ž… ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ ์ค€๋‹ต๋‹ˆ๋‹ค.

1๏ธโƒฃ ๋ฐฐ์—ด ๋ฐ ํŠœํ”Œ์˜ ๋ถˆ๋ณ€์„ฑ ํ™•๋ณด

์ƒ์ˆ˜ ๋ฐฐ์—ด์ด๋‚˜ ํŠœํ”Œ์„ ์ •์˜ํ•  ๋•Œ๋„ as const๋Š” ๋งค์šฐ ์œ ์šฉํ•ด์š”. ํŠนํžˆ ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ์ „๋‹ฌ๋  ๋•Œ ๋ถˆ๋ณ€์„ฑ์„ ๋ณด์žฅํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์— ๋ง์ด์ฃ .

const PERMISSIONS = ["read", "write", "delete"] as const; type Permission = typeof PERMISSIONS[number]; // "read" | "write" | "delete" function checkPermission(userPermissions: readonly Permission[]) { // userPermissions๋Š” ์ฝ๊ธฐ ์ „์šฉ ๋ฐฐ์—ด์ด์—์š”. // userPermissions.push("execute"); // Error: Property 'push' does not exist on type 'readonly Permission[]'. console.log("User permissions:", userPermissions); } const userPerms = ["read", "write"] as const; checkPermission(userPerms); // ์ •์ƒ ์ž‘๋™ํ•ด์š”. // checkPermission(["read", "update"]); // Error: Type '"update"' is not assignable to type 'Permission'.
์œ ์šฉํ•œ ํŒ

as const๋ฅผ ํ†ตํ•ด PERMISSIONS๋Š” readonly ["read", "write", "delete"] ํƒ€์ž…์ด ๋˜๊ณ , Permission ํƒ€์ž…์€ ์ด ๋ฆฌํ„ฐ๋Ÿด๋“ค์˜ ์œ ๋‹ˆ์˜จ ํƒ€์ž…์œผ๋กœ ์ •ํ™•ํžˆ ์ถ”๋ก ๋ผ์š”. checkPermission ํ•จ์ˆ˜๋Š” readonly Permission[] ํƒ€์ž…์„ ์ธ์ž๋กœ ๋ฐ›์•„, ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ๋ฐฐ์—ด์˜ ๋ณ€๊ฒฝ์„ ์‹œ๋„ํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์•„์ค€๋‹ต๋‹ˆ๋‹ค.

2๏ธโƒฃ ํ•จ์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ์ œ๋„ค๋ฆญ์—์„œ์˜ ์‘์šฉ

as const๋Š” ์ œ๋„ค๋ฆญ ํƒ€์ž…๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ๋  ๋•Œ ๋”์šฑ ๊ฐ•๋ ฅํ•œ ํƒ€์ž… ์ถ”๋ก ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์š”. ํŠนํžˆ ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์„ ์ธ์ž๋กœ ๋ฐ›๋Š” ํ•จ์ˆ˜์—์„œ ์œ ์šฉํ•˜์ฃ .

function createAction<T extends { type: string; payload: unknown }>(action: T) { return action; } const ADD_TODO_ACTION = createAction({ type: "ADD_TODO", payload: { id: 1, text: "Learn as const" }, }); // ADD_TODO_ACTION์˜ type์€ string์œผ๋กœ ์ถ”๋ก ๋ผ์š”. const ADD_TODO_ACTION_AS_CONST = createAction({ type: "ADD_TODO", payload: { id: 1, text: "Learn as const" }, } as const); // ADD_TODO_ACTION_AS_CONST์˜ type์€ "ADD_TODO" (๋ฆฌํ„ฐ๋Ÿด ํƒ€์ž…)์œผ๋กœ ์ถ”๋ก ๋ผ์š”! type ActionType = typeof ADD_TODO_ACTION_AS_CONST.type; // "ADD_TODO" function handleAction(actionType: ActionType) { console.log(`Handling action of type: ${actionType}`); } handleAction("ADD_TODO"); // ์ •์ƒ ์ž‘๋™ํ•ด์š”. // handleAction("REMOVE_TODO"); // Type Error: Argument of type '"REMOVE_TODO"' is not assignable to parameter of type '"ADD_TODO"'.
์ •๋ณด

createAction ํ•จ์ˆ˜์— as const๋ฅผ ์ ์šฉํ•œ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜๋ฉด, ์ œ๋„ค๋ฆญ T๊ฐ€ ๋” ์ข์€ ๋ฆฌํ„ฐ๋Ÿด ํƒ€์ž…์œผ๋กœ ์ถ”๋ก ๋˜์–ด ADD_TODO_ACTION_AS_CONST.type์˜ ํƒ€์ž…์ด ์ •ํ™•ํžˆ "ADD_TODO"๊ฐ€ ๋ผ์š”. ์ด๋ฅผ ํ†ตํ•ด handleAction ํ•จ์ˆ˜์—์„œ ์ž˜๋ชป๋œ ์•ก์…˜ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ปดํŒŒ์ผ ์‹œ์ ์— ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์–ด์š”.

as const๋Š” ๊ฐ•๋ ฅํ•˜์ง€๋งŒ, ๋ช‡ ๊ฐ€์ง€ ์ฃผ์˜ํ•  ์ ๋„ ์žˆ์–ด์š”.

0๏ธโƒฃ ํƒ€์ž… ๊ฐ€๋“œ์™€ ๋Ÿฐํƒ€์ž„ ๋™์ž‘์˜ ๋ถ„๋ฆฌ

as const๋Š” ์ปดํŒŒ์ผ ์‹œ์ ์— ํƒ€์ž… ์ถ”๋ก ์„ ๋•๋Š” ๋„๊ตฌ์ด์ง€, ๋Ÿฐํƒ€์ž„์— ๊ฐ’์˜ ๋ถˆ๋ณ€์„ฑ์„ ๊ฐ•์ œํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์—์š”. JavaScript ์ฝ”๋“œ๋Š” ์—ฌ์ „ํžˆ ํ•ด๋‹น ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์ธ์ง€ํ•ด์•ผ ํ•ด์š”.

const CONFIG = { API_KEY: "abc", DEBUG_MODE: true, } as const; // ์‹ค์ œ๋กœ CONFIG๋Š” JavaScript ๊ฐ์ฒด์ด๋ฏ€๋กœ ๋Ÿฐํƒ€์ž„์—๋Š” ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์–ด์š”. // CONFIG.API_KEY = "xyz"; // TypeScript ์—๋Ÿฌ ๋ฐœ์ƒ. // ํ•˜์ง€๋งŒ Babel์ด๋‚˜ ๋‹ค๋ฅธ ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ๋ฅผ ํ†ตํ•ด ํƒ€์ž… ์ฒดํฌ ์—†์ด JS๋กœ ๋ณ€ํ™˜๋˜๋ฉด, // ๋Ÿฐํƒ€์ž„์—๋Š” CONFIG.API_KEY = "xyz"; ์™€ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ์–ด์š”. // ๋งŒ์•ฝ ๋Ÿฐํƒ€์ž„ ๋ถˆ๋ณ€์„ฑ์„ ์ •๋ง๋กœ ๋ณด์žฅํ•ด์•ผ ํ•œ๋‹ค๋ฉด, Object.freeze()๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ด์š”. const FROZEN_CONFIG = Object.freeze({ API_KEY: "abc", DEBUG_MODE: true, }); // FROZEN_CONFIG.API_KEY = "xyz"; // ๋Ÿฐํƒ€์ž„์—์„œ ์—๋Ÿฌ๋Š” ์•„๋‹ˆ์ง€๋งŒ, ์—„๊ฒฉ ๋ชจ๋“œ์—์„œ๋Š” TypeError๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ณ  ๊ฐ’์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•„์š”.
๊ฒฝ๊ณ 

as const๋Š” ํƒ€์ž… ์‹œ์Šคํ…œ ๋‚ด์—์„œ ๋ถˆ๋ณ€์„ฑ์„ ๋ณด์žฅํ•˜์ง€๋งŒ, ์‹ค์ œ JavaScript ๋Ÿฐํƒ€์ž„์—์„œ๋Š” Object.freeze()์™€ ๊ฐ™์€ ๋ช…์‹œ์ ์ธ ์กฐ์น˜๋ฅผ ์ทจํ•ด์•ผ๋งŒ ๊ฐ์ฒด์˜ ๋ถˆ๋ณ€์„ฑ์„ ํ™•์‹คํžˆ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์–ด์š”. TypeScript์˜ ์—ญํ• ์€ ๊ฐœ๋ฐœ์ž์˜ ์‹ค์ˆ˜๋ฅผ ์ปดํŒŒ์ผ ์‹œ์ ์— ์žก์•„์ฃผ๋Š” ๊ฒƒ์ด๋ผ๋Š” ์ ์„ ๊ธฐ์–ตํ•ด ์ฃผ์„ธ์š”.

1๏ธโƒฃ ๊ณผ๋„ํ•œ ์‚ฌ์šฉ์€ ์ง€์–‘ํ•ด์š”

as const๋Š” ๊ฐ•๋ ฅํ•˜์ง€๋งŒ, ๋ชจ๋“  ๋ณ€์ˆ˜์— ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ์ ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ข‹์ง€ ์•Š์•„์š”. ํŠนํžˆ ๋ณ€๊ฒฝ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๋ณ€์ˆ˜์— ์‚ฌ์šฉํ•˜๋ฉด ์˜คํžˆ๋ ค ์ฝ”๋“œ๋ฅผ ์œ ์—ฐํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์š”.


์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜๋‚˜, ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ ๊ฐ’์—๋Š” as const๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์•„์š”. as const๋Š” ์ฃผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒ์ˆ˜, ์„ค์ • ๊ฐ’, ๋˜๋Š” ๋ถˆ๋ณ€์„ฑ์ด ๋ณด์žฅ๋˜์–ด์•ผ ํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํšจ๊ณผ์ ์ด๋ž๋‹ˆ๋‹ค.

๐Ÿ“ ์ •๋ฆฌํ•˜๋ฉฐ

์˜ค๋Š˜์€ TypeScript์˜ as const ๊ตฌ๋ฌธ์— ๋Œ€ํ•ด ์‹ฌ์ธต์ ์œผ๋กœ ์•Œ์•„๋ณด์•˜์–ด์š”. as const๋Š” ๋‹จ์ˆœํžˆ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ๊ธฐ๋Šฅ์„ ๋„˜์–ด, ์ฝ”๋“œ์˜ ์˜๋„๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๊ณ  ์ž ์žฌ์ ์ธ ๋ฒ„๊ทธ๋ฅผ ์ค„์ด๋Š” ๋ฐ ํฐ ๋„์›€์„ ์ฃผ๋Š” ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์˜ˆ์š”.


0๏ธโƒฃ as const๋กœ ์–ป๋Š” ์ด์ ๋“ค

  • ์ •ํ™•ํ•œ ๋ฆฌํ„ฐ๋Ÿด ํƒ€์ž… ์ถ”๋ก : "PENDING"๊ณผ ๊ฐ™์€ ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด์„ string์ด ์•„๋‹Œ "PENDING" ์ž์ฒด๋กœ ์ถ”๋ก ํ•˜๊ฒŒ ํ•˜์—ฌ ํƒ€์ž… ์•ˆ์ •์„ฑ์„ ๋†’์—ฌ์š”.
  • ์žฌ๊ท€์  ๋ถˆ๋ณ€์„ฑ ๋ถ€์—ฌ: ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด ๋‚ด๋ถ€์˜ ๋ชจ๋“  ์†์„ฑ๊ณผ ์š”์†Œ์— readonly ์†์„ฑ์„ ๋ถ€์—ฌํ•˜์—ฌ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์„ ๋ฐฉ์ง€ํ•ด์š”.
  • ์ฝ”๋“œ ๊ฐ€๋…์„ฑ ๋ฐ ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒ: ๋ถˆ๋ณ€์„ฑ์ด ๋ช…ํ™•ํ•ด์ง€๋ฏ€๋กœ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฌ์›Œ์ ธ์š”.
  • ์ปดํŒŒ์ผ ์‹œ์  ์˜ค๋ฅ˜ ๊ฐ์ง€: ๋Ÿฐํƒ€์ž„์— ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ฏธ๋ฆฌ ์žก์•„๋‚ด์–ด ๊ฐœ๋ฐœ ์‹œ๊ฐ„์„ ๋‹จ์ถ•์‹œ์ผœ ์ค€๋‹ต๋‹ˆ๋‹ค.

1๏ธโƒฃ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋‚˜์•„๊ฐ€๊ธฐ

as const๋Š” TypeScript๋ฅผ ์ข€ ๋” ๊นŠ์ด ์žˆ๊ฒŒ ํ™œ์šฉํ•˜๊ณ  ์‹ถ์€ ์ดˆ์ค‘๊ธ‰ ๊ฐœ๋ฐœ์ž๋ถ„๋“ค๊ป˜ ๊ผญ ํ•„์š”ํ•œ ์ง€์‹์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด์š”. ์˜ค๋Š˜ ๋ฐฐ์šด ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”„๋กœ์ ํŠธ์— as const๋ฅผ ์ ์šฉํ•ด ๋ณด๋ฉด์„œ, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ๊ฐ•๋ ฅํ•จ์„ ์ง์ ‘ ๊ฒฝํ—˜ํ•ด ๋ณด์‹œ๊ธธ ๋ฐ”๋ผ์š”.


๋” ๋‚˜์•„๊ฐ€, as const์™€ ํ•จ๊ป˜ type๊ณผ interface๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ณต์žกํ•œ ํƒ€์ž…์„ ์ •์˜ํ•˜๊ณ , ์ œ๋„ค๋ฆญ๊ณผ ์กฐํ•ฉํ•˜์—ฌ ๋”์šฑ ์œ ์—ฐํ•˜๊ณ  ํƒ€์ž… ์•ˆ์ „ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด ๋ณด๋Š” ์—ฐ์Šต๋„ ํ•ด๋ณด์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”.


๊ถ๊ธˆํ•œ ์ ์ด ์žˆ๋‹ค๋ฉด ์–ธ์ œ๋“ ์ง€ ๋Œ“๊ธ€๋กœ ๋‚จ๊ฒจ์ฃผ์„ธ์š”. ๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ ๋˜ ์œ ์ตํ•œ ์ •๋ณด๋กœ ์ฐพ์•„๋ต™๊ฒ ์Šต๋‹ˆ๋‹ค!

๐Ÿ“ฎ ์ฐธ๊ณ 

์—ฐ๊ด€๋œ ํฌ์ŠคํŠธ