๐Ÿ“Œ Literal Type

ํƒ€์ž… ์ง€์ •์‹œ string, number ๊ฐ™์€ ์›์‹œํƒ€์ž…๋งŒ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ์ž๊ฐ€ ์ง€์ •ํ•œ ๊ธ€์ž๋‚˜ ์ˆซ์ž ๋“ค์„ ํƒ€์ž…์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

1
2
let john: "Texas";
let kim: 33;
  • ์ด์ œ john์—๋Š” โ€˜Texasโ€™๋ผ๋Š” ๊ธ€์ž๋งŒ ํ• ๋‹น๋  ์ˆ˜ ์žˆ๊ณ  kim์—๋Š” 33์ด๋ผ๋Š” ์ˆซ์ž๋งŒ ํ• ๋‹น๋  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ”จ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ const

1
const name = "kim" | "loco";

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ๋ณ€ํ•  ์ˆ˜ ์žˆ๋Š” ์ค‘์š”ํ•œ ์ •๋ณด๋ฅผ ์œ„์™€ ๊ฐ™์ด ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฌผ๋ก  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

โ—๏ธ Literal Type ์ฃผ์˜์‚ฌํ•ญ

1
2
3
4
5
6
7
8
9
const user = {
name: "kim",
};

function foo(a: "kim") {
/*...*/
}

foo(user.name); // Error
  • ์œ„ ์˜ˆ์‹œ์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ด์œ ๋Š” user ๊ฐ์ฒด์˜ name ํ”„๋กœํผํ‹ฐ์˜ ํƒ€์ž…์€ string์ธ๋ฐ fooํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜ a์˜ ํƒ€์ž…์€ Literal Type์ธ โ€˜kimโ€™์ด๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜๊ฐ€ ๋‚œ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„  object ๋งŒ๋“ค ๋•Œ ํƒ€์ž…์„ ๋ฏธ๋ฆฌ ์ œํ•œํ•˜์—ฌ๋งŒ๋“ค๊ฑฐ๋‚˜ as const๋ฅผ object ์ž๋ฃŒํ˜•์— ๋ถ™ํ˜€์„œ ์‚ฌ์šฉํ•œ๋‹ค.

๐Ÿฆ– as const

1
2
3
4
5
6
7
8
9
type Lang = "JavaScript" | "TypeScript" | "Python";
function setLang(lang: Lang) {
/* ... */
}

setLang("JavaScript"); // ์ •์ƒ

let language = "JavaScript";
setLang(language); // Error
  • ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๋Š” ์ˆœ๊ฐ„ language ์‹๋ณ„์ž๊ฐ€ ํƒ€์ž… ์ถ”๋ก ์„ string์œผ๋กœ ํ•˜์˜€๋‹ค.

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€

1. ํƒ€์ž… ์„ ์–ธ์‹œ language์˜ ๊ฐ€๋Šฅํ•œ ๊ฐ’ ์ œํ•œ

1
2
let lang: Lang = "JavaScript";
setLang(lang); // ์ •์ƒ

2. const ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์ˆ˜๋กœ ํ‘œํ˜„

1
2
const lang = "JavaScript";
setLang(lang); // ์ •์ƒ
  • const ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํƒ€์ž… ์ฒด์ปค์—๊ฒŒ lang์€ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์•Œ๋ ค์ค€๋‹ค.
  • ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” lang์— ๋Œ€ํ•ด ๋” ์ •ํ™•ํ•œ ํƒ€์ž…์ธ โ€˜JavaScriptโ€™๋กœ ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.
1
2
3
4
5
6
function panTo(where: [number, number]) {
/* ... */
}
const loc = [10, 20]; // type is number[]

panTo(loc); // Error
  • ํŠœํ”Œ ์‚ฌ์šฉ ์‹œ ์ฃผ์˜์‚ฌํ•ญ์€ const๋กœ ์„ ์–ธํ•˜์—ฌ๋„ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๊ธธ์ด๋ฅผ ์•Œ ์ˆ˜ ์—†๋Š” ์ˆซ์ž์˜ ๋ฐฐ์—ด๋กœ ์ถ”๋ก ํ•œ๋‹ค.
  • const loc: [number, number] = [10, 20] ๋กœ ์˜๋„๋ฅผ ์ •ํ™•ํžˆ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋„๋ก ํƒ€์ž… ์„ ์–ธ์„ ์ œ๊ณตํ•œ๋‹ค.

const ์™€ as const ์ฐจ์ด

  • const ๋Š” ๋‹จ์ง€ ๊ฐ’์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฐธ์กฐ๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ์–•์€ ์ƒ์ˆ˜์ด๋‹ค.
  • as const(์ƒ์ˆ˜ ๋ฌธ๋งฅ ์ œ๊ณต)์€ ๊ทธ ๊ฐ’์ด ๋‚ด๋ถ€๊นŒ์ง€ ๊นŠ์€ ์ƒ์ˆ˜๋ผ๋Š” ์‚ฌ์‹ค์„ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—๊ฒŒ ์•Œ๋ ค์ค€๋‹ค.
    • const loc = [10, 20] as const ํƒ€์ž…์ด readonly [number ,number]
      1
      2
      3
      function panTo(where: readonly [number, number]) {/* ... */};
      const loc = [10,20] as const;
      panTo(loc); // ์ •์ƒ
    • ํ•œ๊ฐ€์ง€ ๋‹จ์ ์œผ๋กœ๋Š” ๋งŒ์•ฝ ํŠœํ”Œ์— ์„ธ๋ฒˆ์งธ ์š”์†Œ ์ถ”๊ฐ€์‹œ ์˜ค๋ฅ˜๊ฐ€ ํƒ€์ž… ์ •์˜๊ฐ€ ์•„๋‹Œ ํ˜ธ์ถœ๋˜๋Š” ๊ณณ์—์„œ ๋ฐœ์ƒํ•œ๋‹ค.