Google์˜ TypeScript Style Guide > Language features

FeelsBotManยท2024๋…„ 11์›” 26์ผ

4.8 Primitive literals

4.8.1 String literals

Single Quotes ์‚ฌ์šฉ: (๐Ÿคท)
์ผ๋ฐ˜์ ์ธ ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด์—์„œ๋Š” ์‹ฑ๊ธ€ ์ฟผํŠธ(')๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋œ๋‹ค. ๋”๋ธ” ์ฟผํŠธ(")๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์‹ฑ๊ธ€ ์ฟผํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ผ๋ฐ˜์ ์ธ ์ฝ”๋“œ ์Šคํƒ€์ผ๊ณผ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.
Before

const greeting = "Hello, world!";

After

const greeting = 'Hello, world!';

๋ฌธ์ž์—ด์— ์‹ฑ๊ธ€ ์ฟผํŠธ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ, ์ด์Šค์ผ€์ดํ”„(\') ๋Œ€์‹  ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋…์„ฑ์„ ๋†’์ธ๋‹ค.
Before

const message = 'It\'s a beautiful day!';

After

const message = `It's a beautiful day!`;

ํ…œํ”Œ๋ฆฟ ๋ฌธ์ž์—ด ์‚ฌ์šฉ:
ํ…œํ”Œ๋ฆฟ ๋ฌธ์ž์—ด์€ ๋ฐฑํ‹ฑ(`)์œผ๋กœ ๊ฐ์‹ธ๊ณ , ๋ฌธ์ž์—ด ๋‚ด์—์„œ ๋™์  ๋ฐ์ดํ„ฐ ์‚ฝ์ž…๊ณผ ์—ฌ๋Ÿฌ ์ค„ ๋ฌธ์ž์—ด ์ž‘์„ฑ์„ ๊ฐ„๋‹จํžˆ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
๋ณต์žกํ•œ ๋ฌธ์ž์—ด ์—ฐ๊ฒฐ ์ž‘์—…์€ ํ…œํ”Œ๋ฆฟ ๋ฌธ์ž์—ด๋กœ ๋Œ€์ฒดํ•˜๋Š” ๊ฒƒ์ด ๋” ๋ช…ํ™•ํ•˜๊ณ  ๊ฐ€๋…์„ฑ์ด ์ข‹๋‹ค.

Before

const message = 'Hello, ' + name + '! You have ' + count + ' messages.';

After

const message = `Hello, ${name}! You have ${count} messages.`;

์ค„ ๋ฐ”๊ฟˆ(Line Continuation) ๊ธˆ์ง€:
๋ฌธ์ž์—ด์„ ๋ฐฑ์Šฌ๋ž˜์‹œ(\)๋ฅผ ์‚ฌ์šฉํ•ด ์ค„ ๋ฐ”๊ฟˆํ•˜๋ฉด ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๊ณ , ๊ณต๋ฐฑ๊ณผ ๊ด€๋ จ๋œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฐฑ์Šฌ๋ž˜์‹œ ๋’ค์— ๊ณต๋ฐฑ์ด ์žˆ์œผ๋ฉด ์—๋Ÿฌ๋ฅผ ์ดˆ๋ž˜ํ•œ๋‹ค.
์ค„ ๋ฐ”๊ฟˆ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ, ๋ฌธ์ž์—ด ์—ฐ๊ฒฐ(+)์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ํ…œํ”Œ๋ฆฟ ๋ฌธ์ž์—ด์„ ํ™œ์šฉํ•œ๋‹ค.

Before

const longString = 'This is a very long string that spans multiple lines. \
It can cause tricky errors if there is any trailing whitespace.';

After

// ๋ฌธ์ž์—ด ์—ฐ๊ฒฐ
const longString = 'This is a very long string ' +
    'that spans multiple lines without issues.';

// ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด ์‚ฌ์šฉ
const longString = `This is a very long string 
that spans multiple lines cleanly.`;

// ํ…œํ”Œ๋ฆฟ ๋ฌธ์ž์—ด๋กœ ์—ฌ๋Ÿฌ ์ค„ ์ฒ˜๋ฆฌ
function arithmetic(a, b) {
  return `Here is a table of arithmetic operations:
${a} + ${b} = ${a + b}
${a} - ${b} = ${a - b}
${a} * ${b} = ${a * b}
${a} / ${b} = ${a / b}`;
}

4.8.2 Number literals

์ˆซ์ž ๋ฆฌํ„ฐ๋Ÿด ํ‘œ๊ธฐ๋ฒ•:
JavaScript์—์„œ๋Š” ์ˆซ์ž๋ฅผ ๋‹ค์–‘ํ•œ ์ง„๋ฒ•(Decimal, Hexadecimal, Octal, Binary)์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ˆซ์ž ๋ฆฌํ„ฐ๋Ÿด์˜ ์ ‘๋‘์‚ฌ๋Š” ์†Œ๋ฌธ์ž๋กœ ํ†ต์ผํ•ด์•ผ ํ•œ๋‹ค.

์ง„๋ฒ•ํ‘œ๊ธฐ๋ฒ• ์˜ˆ์‹œ์„ค๋ช…
Decimal4210์ง„์ˆ˜ (๊ธฐ๋ณธ)
Hex0x2a16์ง„์ˆ˜, ์ ‘๋‘์‚ฌ 0x
Octal0o528์ง„์ˆ˜, ์ ‘๋‘์‚ฌ 0o
Binary0b1010102์ง„์ˆ˜, ์ ‘๋‘์‚ฌ 0b
const decimal = 42;     // 10์ง„์ˆ˜
const hex = 0x2a;       // 16์ง„์ˆ˜
const octal = 0o52;     // 8์ง„์ˆ˜
const binary = 0b101010; // 2์ง„์ˆ˜

์„ ํ–‰ 0 ๊ธˆ์ง€:
์ˆซ์ž ๋ฆฌํ„ฐ๋Ÿด์— ์„ ํ–‰ 0(leading zero)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ํ˜ผ๋ž€์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ์ „์—๋Š” ์„ ํ–‰ 0์ด ์žˆ๋Š” ์ˆซ์ž๊ฐ€ 8์ง„์ˆ˜๋กœ ํ•ด์„๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค(ECMAScript 5 ์ด์ „).
ECMAScript 6 ์ด์ƒ์—์„œ๋Š” ์„ ํ–‰ 0์„ ์‚ฌ์šฉํ•˜๋Š” ์ˆซ์ž ๋ฆฌํ„ฐ๋Ÿด์€ ๋ฌธ๋ฒ• ์˜ค๋ฅ˜๋กœ ๊ฐ„์ฃผ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์„ ํ–‰ 0์€ ๋ฐ˜๋“œ์‹œ 0x, 0o, 0b์™€ ๊ฐ™์ด ์˜ฌ๋ฐ”๋ฅธ ์ ‘๋‘์‚ฌ๊ฐ€ ๋’ค๋”ฐ๋ผ์•ผ ํ•œ๋‹ค.

Before

// ์˜ˆ์ „ JavaScript์—์„œ ์„ ํ–‰ 0์€ 8์ง„์ˆ˜๋กœ ํ•ด์„๋˜์—ˆ๋‹ค.
const octal = 052; // 42 (8์ง„์ˆ˜)

After

// ์˜ฌ๋ฐ”๋ฅธ 8์ง„์ˆ˜ ํ‘œํ˜„
const octal = 0o52;

4.8.3 Type coercion

์•”์‹œ์  ๊ฐ•์ œ ๋ณ€ํ™˜(Implicit coercion) ์ง€์–‘ํ•˜๊ธฐ:
์•”์‹œ์  ๊ฐ•์ œ ๋ณ€ํ™˜์€ ์ฝ”๋“œ์˜ ์˜๋„๋ฅผ ๋ถˆ๋ถ„๋ช…ํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ , ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์˜ค๋ฅ˜๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
Before

if (!!foo) {...}  // BAD:๋ถˆํ•„์š”ํ•œ ์•”์‹œ์  ๊ฐ•์ œ ๋ณ€ํ™˜
while (!!foo) {...}

After

if (foo) {...}  // GOOD: ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑ
while (foo) {...}

๋ฌธ์ž์—ด ๋ช…์‹œ์  ๋ณ€ํ™˜์— String() ๋˜๋Š” Boolean() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ:

const bool = Boolean(false); // false
const str = String(123);     // "123"
const bool2 = !!str;         // true
const str2 = `result: ${bool2}`; // "result: true"
  • ๋ณ€ํ™˜์ด ๋ช…ํ™•ํ•˜๊ณ  ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์‹œ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Œ
  • ์•”์‹œ์  ๊ฐ•์ œ ๋ณ€ํ™˜๋ณด๋‹ค ์˜๋„๋ฅผ ๋ช…ํ™•ํžˆ ํ‘œํ˜„
  • !! ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ’์„ ๋ช…์‹œ์ ์œผ๋กœ boolean์œผ๋กœ ๋ณ€ํ™˜

์—ด๊ฑฐํ˜• ๊ฐ’์„ ๋ถˆ๋ฆฌ์–ธ์œผ๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š๊ธฐ:
์—ด๊ฑฐํ˜•(Enum)์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ˆซ์ž ๊ฐ’๊ณผ ๋งคํ•‘๋˜๋ฉฐ, ์ฒซ ๋ฒˆ์งธ ๊ฐ’์€ 0์œผ๋กœ ํ• ๋‹น๋œ๋‹ค.
Boolean(enumValue)๋‚˜ !!enumValue๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด:

  • ์ฒซ ๋ฒˆ์งธ ๊ฐ’(0)์€ falsy๋กœ ํ‰๊ฐ€
  • ๋‚˜๋จธ์ง€ ๊ฐ’์€ truthy๋กœ ํ‰๊ฐ€
    ์ด๋Ÿฐ ๋™์ž‘์€ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์˜ค๋ฅ˜๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค.

Before

enum SupportLevel {
  NONE,
  BASIC,
  ADVANCED,
}

const level: SupportLevel = SupportLevel.NONE;
let enabled = Boolean(level); // ์ž˜๋ชป๋œ ๋ฐฉ์‹: `NONE`์ด `false`๋กœ ํ‰๊ฐ€๋จ

After

enum SupportLevel {
  NONE,
  BASIC,
  ADVANCED,
}

const level: SupportLevel = SupportLevel.NONE;
let enabled = level !== SupportLevel.NONE; // ๋ช…์‹œ์  ๋น„๊ต

์ˆซ์žํ˜• ๋ณ€ํ™˜์— Number() ์‚ฌ์šฉํ•˜๊ธฐ:
์ˆซ์ž ๊ฐ’์„ ํŒŒ์‹ฑํ•  ๋•Œ๋Š” Number()๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๊ฒฐ๊ณผ๊ฐ€ ์œ ํšจํ•œ์ง€ ๋ช…์‹œ์ ์œผ๋กœ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค:

  • isNaN: ์ˆซ์ž๊ฐ€ NaN์ธ์ง€ ํ™•์ธ
  • isFinite: ์ˆซ์ž๊ฐ€ ์œ ํ•œํ•œ ๊ฐ’์ธ์ง€ ํ™•์ธ

Before

const x = +y; // ๊ฐ€๋…์„ฑ์ด ๋‚ฎ๊ณ , ์‹ค์ˆ˜ํ•˜๊ธฐ ์‰ฌ์›€
const n = parseInt(someString, 10); // ์—๋Ÿฌ ๋ฐœ์ƒ ๊ฐ€๋Šฅ
const f = parseFloat(someString); // ์—๋Ÿฌ ๋ฐœ์ƒ ๊ฐ€๋Šฅ
  • ๋ฌธ์ž์—ด์— ์ถ”๊ฐ€์ ์ธ ๋ฌธ์ž๊ฐ€ ํฌํ•จ๋  ๊ฒฝ์šฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ  ์ž˜๋ชป๋œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•จ.

After

let f = Number(someString); // ์ˆซ์ž๋กœ ๋ณ€ํ™˜
if (!isFinite(f)) throw new Error('Invalid number'); // ์œ ํšจ์„ฑ ํ™•์ธ
if (isNaN(f)) handleError(); // NaN์ธ์ง€ ํ™•์ธ
f = Math.floor(f);           // ์ •์ˆ˜๋กœ ๋ณ€ํ™˜

Number(''), Number(' '), Number('\t')๋Š” NaN ๋Œ€์‹  0์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
Number('Infinity'), Number('-Infinity')๋Š” Infinity์™€ -Infinity๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
์ง€์ˆ˜ ํ‘œ๊ธฐ๋ฒ•, ์˜ˆ๋ฅผ๋“ค์–ด Number('1e+309'), Number('-1e+309')์€ ๋ฌดํ•œ๋Œ€๋กœ ์˜ค๋ฒ„ํ”Œ๋กœ๋  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ ํŠน๋ณ„ํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ๋‹ค.


4.9 Control structures

4.9.1 Control flow statements and blocks

๋ชจ๋“  ์ œ์–ด ํ๋ฆ„๋ฌธ(if, else, for, while, ๋“ฑ)์€ ํ•ญ์ƒ ์ค‘๊ด„ํ˜ธ๋กœ ์ฝ”๋“œ ๋ธ”๋ก์„ ๊ฐ์‹ธ์•ผ ํ•œ๋‹ค.
๋‹จ, if ๋ฌธ์ด ํ•œ ์ค„๋กœ ๋๋‚˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ค‘๊ด„ํ˜ธ ์ƒ๋žต์ด ํ—ˆ์šฉ๋œ๋‹ค.

Before

if (x)
  doSomething(); // ์ค‘๊ด„ํ˜ธ ์—†์ด ์—ฌ๋Ÿฌ ์ค„ ์ฝ”๋“œ ์ž‘์„ฑ ์‹œ ๊ฐ€๋…์„ฑ ๋ฌธ์ œ ๋ฐœ์ƒ

After

if (x) {
  doSomething();
}

for (let i = 0; i < 10; i++) {
  console.log(i);
}

if (x) x.doSomething(); // ํ•œ ์ค„ ์ฝ”๋“œ์ธ ๊ฒฝ์šฐ์—๋งŒ ์ค‘๊ด„ํ˜ธ ์ƒ๋žต ๊ฐ€๋Šฅ

์ œ์–ด๋ฌธ ๋‚ด๋ถ€์—์„œ ๋ณ€์ˆ˜ ํ• ๋‹น์€ ์ง€์–‘ํ•ด์•ผ ํ•œ๋‹ค.
์ด๋Š” ํ• ๋‹น(=)๊ณผ ๋น„๊ต(==)๋ฅผ ํ˜ผ๋™ํ•  ๊ฐ€๋Šฅ์„ฑ์„ ์ค„์ด๊ธฐ ์œ„ํ•จ์ด๋‹ค.
๋‹จ, ์˜๋„์ ์œผ๋กœ ํ• ๋‹นํ•˜๋Š” ๊ฒฝ์šฐ ์ด์ค‘ ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•ด ์˜๋„๋ฅผ ๋ช…ํ™•ํžˆ ํ‘œ์‹œํ•œ๋‹ค.

Before

if (x = someFunction()) {
  // ํ• ๋‹น์ด ์กฐ๊ฑด๋ฌธ ๋‚ด๋ถ€์— ์žˆ์–ด ํ˜ผ๋™ ๊ฐ€๋Šฅ
}

After

x = someFunction();
if (x) {
  // x๋ฅผ ์‚ฌ์šฉ
}
while ((x = someFunction())) {
  // ํ• ๋‹น์ด ์˜๋„์ ์ž„์„ ์•Œ ์ˆ˜ ์žˆ์Œ
}

๋ฐฐ์—ด์„ ๋ฐ˜๋ณต ์ฒ˜๋ฆฌํ•  ๋•Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์„ ์šฐ์„ ์ ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค:

  • for ... of: ๋ฐฐ์—ด์˜ ๊ฐ’์„ ์ง์ ‘ ๋ฐ˜๋ณต
  • Array.prototype.forEach: ๋ฐ˜๋ณต ๋™์ž‘์„ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋กœ ์ฒ˜๋ฆฌ
  • ์ „ํ†ต์ ์ธ for ๋ฃจํ”„: ์ธ๋ฑ์Šค๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉ
for (const value of someArr) {
  console.log(value);
}

for (let i = 0; i < someArr.length; i++) {
  const value = someArr[i];  // ์ธ๋ฑ์Šค๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ
  console.log(i, value);
}

for (const [i, value] of someArr.entries()) {
  console.log(i, value);
}

for ... in์€ ๋ฐฐ์—ด์ด ์•„๋‹Œ ๊ฐ์ฒด ์ˆœํšŒ์šฉ์ด๋ฉฐ, ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋น„์ง๊ด€์ ์ด๋ฏ€๋กœ ๋ฐฐ์—ด์— ์‚ฌ์šฉํ•˜์ง€ ๋ง์ž.

๊ฐ์ฒด๋ฅผ ๋ฐ˜๋ณต ์ฒ˜๋ฆฌํ•  ๋•Œ๋Š” for ... in๋ณด๋‹ค Object.keys, Object.values, Object.entries๋ฅผ ๊ถŒ์žฅํ•œ๋‹ค.

for (const key of Object.keys(obj)) {
  console.log(key);
}

for (const value of Object.values(obj)) {
  console.log(value);
}

for (const [key, value] of Object.entries(obj)) {
  console.log(key, value);
}

for (const key in obj) {
  if (!obj.hasOwnProperty(key)) continue;
  doWork(key, obj[key]);
}

4.9.2 Grouping parentheses

์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ๋ถˆํ•„์š”ํ•œ ๊ด„ํ˜ธ ์‚ฌ์šฉ์„ ํ”ผํ•˜๋˜, ์ฝ๊ธฐ ์‰ฝ๊ณ  ์˜คํ•ด์˜ ์†Œ์ง€๊ฐ€ ์—†๋„๋ก ์ž‘์„ฑํ•˜๋ผ.

์„ ํƒ์ ์ธ ๊ทธ๋ฃนํ™” ๊ด„ํ˜ธ๋Š” ์ž‘์„ฑ์ž์™€ ๊ฒ€ํ† ์ž๊ฐ€ ๊ทธ๋ฃนํ™” ๊ด„ํ˜ธ ์—†์ด๋Š” ์ฝ”๋“œ๊ฐ€ ์˜คํ•ด๋ฐ›์„ ๊ฐ€๋Šฅ์„ฑ์ด ์ „ํ˜€ ์—†๊ณ , ์ฝ”๋“œ์˜ ์ฝ๊ธฐ๊ฐ€ ๋” ์‰ฌ์›Œ์ง€์ง€ ์•Š์„ ๊ฒƒ์— ๋™์˜ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ƒ๋žตํ•œ๋‹ค. (๋ชจ๋“  ๋…์ž๊ฐ€ ์—ฐ์‚ฐ์ž ์šฐ์„ ์ˆœ์œ„ ํ‘œ ์ „์ฒด๋ฅผ ์•”๊ธฐํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋Š” ๊ฒƒ์€ ํ•ฉ๋ฆฌ์ ์ด์ง€ ์•Š๋‹ค.)

delete, typeof, void, return, throw, case, in, of, yield ๋‹ค์Œ์— ๋‚˜์˜ค๋Š” ์ „์ฒด ํ‘œํ˜„์‹ ์ฃผ์œ„์— ๋ถˆํ•„์š”ํ•œ ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ง์ž.
Before

return (a + b); 
throw (new Error('Error message'));

After

return a + b; 
throw new Error('Error message');

4.9.3 Exception handling

์˜ˆ์™ธ๋Š” ์–ธ์–ด์˜ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด๋ฏ€๋กœ ์˜ˆ์™ธ์ ์ธ ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
์‚ฌ์šฉ์ž ์ •์˜ ์˜ˆ์™ธ๋Š” ํ•จ์ˆ˜์—์„œ ์ถ”๊ฐ€์ ์ธ ์˜ค๋ฅ˜ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค.

new๋ฅผ ์‚ฌ์šฉํ•œ ์ธ์Šคํ„ด์Šคํ™” ํ•˜๊ธฐ:
throw Error()๋ณด๋‹ค๋Š” throw new Error()๋ฅผ ์‚ฌ์šฉ. ์ด๋Š” ๋‹ค๋ฅธ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šคํ™” ๋ฐฉ์‹๊ณผ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•œ๋‹ค.
Before

throw Error('Foo is not a valid bar.');

After

throw new Error('Foo is not a valid bar.');

Error๋งŒ throw ํ•˜๊ธฐ:
์ผ๋ฐ˜์ ์œผ๋กœ JavaScript์—์„œ๋Š” throw ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ๋•Œ Error ๊ฐ์ฒด๋ฅผ ๋˜์ง„๋‹ค.
์ž„์‹œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋ฐฉ์‹(์˜ค๋ฅ˜ ์ปจํ…Œ์ด๋„ˆ ์ฐธ์กฐ ์œ ํ˜• ์ „๋‹ฌ์ด๋‚˜ ์˜ค๋ฅ˜ ์†์„ฑ์ด ์žˆ๋Š” ๊ฐ์ฒด ๋ฐ˜ํ™˜ ๋“ฑ)๋ณด๋‹ค ์˜ˆ์™ธ๋ฅผ throwํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.
Before

throw 'oh noes!';

new Promise((resolve, reject) => void reject('oh noes!'));
Promise.reject();
Promise.reject('oh noes!');

After

throw new Error('oh noes!');

class MyError extends Error {}
throw new MyError('my oh noes!');

new Promise((resolve) => resolve());
new Promise((resolve, reject) => void reject(new Error('oh noes!')));
Promise.reject(new Error('oh noes!'));
  • Error ๊ฐ์ฒด๋งŒ์ด ์˜๋ฏธ ์žˆ๋Š” ์Šคํƒ ์ถ”์  ์ •๋ณด๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
  • ์ž„์˜์˜ ๊ฐ’์„ ๋˜์ง€๋ฉด ๋””๋ฒ„๊น…์ด ์–ด๋ ค์›Œ์ง„๋‹ค.

์˜ค๋ฅ˜๋ฅผ ์žก์„ ๋•Œ ์ฝ”๋“œ๋Š” ๋ฐœ์ƒํ•œ ๋ชจ๋“  ์˜ค๋ฅ˜๊ฐ€ Error ์ธ์Šคํ„ด์Šค๋ผ๊ณ  ๊ฐ€์ •ํ•ด์•ผ ํ•œ๋‹ค.

function assertIsError(e: unknown): asserts e is Error {
  if (!(e instanceof Error)) throw new Error("e is not an Error");
}

try {
  doSomething();
} catch (e: unknown) {
  // All thrown errors must be Error subtypes. Do not handle
  // other possible values unless you know they are thrown.
  assertIsError(e);
  displayError(e.message);
  // or rethrow:
  throw e;
}

๊ณผ๋„ํ•˜๊ฒŒ ๋ฐฉ์–ด์ ์ธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ๋ง์ž:
๋Œ€๋ถ€๋ถ„์˜ ์ฝ”๋“œ์—์„œ throw๋Š” Error ๊ฐ์ฒด๋ฅผ ๋˜์ง€๊ธฐ ๋•Œ๋ฌธ์—, ํ•ญ์ƒ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ํƒ€์ž…(string, number ๋“ฑ)์„ ๋ฐฉ์–ด์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฝ”๋“œ๋Š” ๋ถˆํ•„์š”ํ•œ ๋ฐ˜๋ณต์  ๋ฐฉ์–ด๊ฐ€ ๋œ๋‹ค.
๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ๊ฐ€๋Šฅ์„ฑ์ด ์ ์€ ์ƒํ™ฉ์—์„œ "๋ชจ๋“  ๊ฒฝ์šฐ"๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ ค๋Š” ๊ณผ๋„ํ•œ ๋ฐฉ์–ด๋Š” ์ฝ”๋“œ ๋ณต์žก์„ฑ์„ ๋†’์ด๊ณ  ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ ๋‹ค.

๋งŒ์•ฝ ์‚ฌ์šฉํ•˜๋Š” API๊ฐ€ Error๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ํƒ€์ž…(์˜ˆ: ๋ฌธ์ž์—ด)์„ ๋˜์ง€๋Š” ๋น„์ •์ƒ์ ์ธ ๋™์ž‘์„ ํ•˜๋Š” ๊ฒฝ์šฐ์— ํ•œํ•˜์—ฌ ๋ฐฉ์–ด์  ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ฌธ์ œ์˜ ์ถœ์ฒ˜๋ฅผ ๋ช…ํ™•ํžˆ ์„ค๋ช…ํ•˜์ž.

๋นˆ catch ๋ธ”๋ก ํ”ผํ•˜๊ธฐ:
Before

try {
  shouldFail();
} catch (e) {
  // ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š์Œ
}

After

try {
  // ์ž‘์—… ์ˆ˜ํ–‰
} catch (e: unknown) {
  // ์™œ ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š๋Š”์ง€ ์ฃผ์„์œผ๋กœ ์„ค๋ช…
  // ์˜ˆ: ํŠน์ • ์˜ˆ์™ธ๋Š” ๋ฌด์‹œํ•ด๋„ ๋˜๋Š” ์ƒํ™ฉ
}

4.9.4 Switch statements

๋ชจ๋“  switch ๋ฌธ์— default ๊ทธ๋ฃน์„ ํฌํ•จํ•˜๊ธฐ:
switch ๋ฌธ์—๋Š” ํ•ญ์ƒ default ๊ทธ๋ฃน์„ ํฌํ•จํ•ด์•ผ ํ•˜๋ฉฐ, ์ด ๊ทธ๋ฃน์€ ํ•ญ์ƒ ๋งˆ์ง€๋ง‰์— ์œ„์น˜ํ•œ๋‹ค.
๋นˆ ๊ทธ๋ฃน๋„ ๊ดœ์ฐฎ๋‹ค. ์ฝ”๋“œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ๋ผ๋„ ์ฃผ์„์œผ๋กœ ์˜๋„๋ฅผ ๋ช…์‹œํ•˜๋ผ.

๋ชจ๋“  ๋น„์–ด ์žˆ์ง€ ์•Š์€ case ๊ทธ๋ฃน์€ ๋ช…์‹œ์ ์œผ๋กœ ์ข…๋ฃŒํ•˜๊ธฐ:
case ๋ธ”๋ก์ด ๋น„์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด, ๋ฐ˜๋“œ์‹œ ๋ช…์‹œ์ ์œผ๋กœ ์ข…๋ฃŒํ•ด์•ผ ํ•œ๋‹ค. ์ข…๋ฃŒ ๋ฐฉ๋ฒ•์€ break, return, ๋˜๋Š” throw๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
๋ช…์‹œ์ ์œผ๋กœ ์ข…๋ฃŒํ•˜์ง€ ์•Š์œผ๋ฉด ๋‹ค์Œ case ๋ธ”๋ก์œผ๋กœ ์‹คํ–‰์ด ๋„˜์–ด๊ฐ€๋Š” fall-through๋กœ ์˜๋„์น˜ ์•Š์€ ๋™์ž‘์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค.
๋ฌผ๋ก  ์—ฌ๋Ÿฌ ์กฐ๊ฑด์„ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์˜๋„์ ์ธ ๋ฌถ์Œ ์ฒ˜๋ฆฌ๋Š” ์‚ฌ์šฉํ•ด๋„ ๋œ๋‹ค.

switch (x) {
  case 1:
    doSomething();
    break; // ๋ช…์‹œ์ ์œผ๋กœ ์ข…๋ฃŒ
  case 2: // fall-through! => ๋‹ค์Œ case๋กœ ์‹คํ–‰์ด ๋„˜์–ด๊ฐ
  case 3:
    doSomethingElse();
    break;
  default:
    // nothing to do.
}

4.9.5 Equality checks

์‚ผ์ค‘ ๋“ฑํ˜ธ(===, !==) ์‚ฌ์šฉํ•˜๊ธฐ:
JavaScript์˜ ๋™๋“ฑ ๋น„๊ต ์—ฐ์‚ฐ์ž(==, !=)์—์„œ ๋ฐœ์ƒํ•˜๋Š” ํƒ€์ž… ๊ฐ•์ œ ๋ณ€ํ™˜(type coercion)์— ๋”ฐ๋ฅธ ์˜ˆ์ธก ๋ถˆ๊ฐ€๋Šฅํ•œ ๋™์ž‘์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํ•ญ์ƒ ์‚ผ์ค‘ ๋“ฑํ˜ธ(===, !==)๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.
==๋Š” ๋‘ ๊ฐ’์ด ๋‹ค๋ฅธ ํƒ€์ž…์ผ ๊ฒฝ์šฐ, ๋น„๊ต๋ฅผ ์‹œ๋„ํ•˜๊ธฐ ์œ„ํ•ด ํ•œ์ชฝ ๊ฐ’์„ ๋‹ค๋ฅธ ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.
์ด๋Ÿฌํ•œ ๋ณ€ํ™˜์€ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
๋˜ํ•œ, ํƒ€์ž… ๊ฐ•์ œ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ==๋Š” JavaScript ์—”์ง„์ด ๋” ๋งŽ์€ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋А๋ฆฌ๋‹ค.
์‚ผ์ค‘ ๋“ฑํ˜ธ๋Š” ํƒ€์ž…์„ ์ฒดํฌํ•œ ๋’ค ๋ฐ”๋กœ ๊ฐ’์„ ๋น„๊ตํ•˜๋ฏ€๋กœ ์„ฑ๋Šฅ์ด ๋” ํšจ์œจ์ ์ด๋‹ค.

์˜ˆ์™ธ: null ๋น„๊ต์—์„œ๋งŒ ==์™€ != ํ—ˆ์šฉ
๋‹จ, null๊ณผ undefined๋ฅผ ๋™์‹œ์— ๋น„๊ตํ•ด์•ผ ํ•  ๋•Œ๋Š” ์˜ˆ์™ธ์ ์œผ๋กœ ==์™€ !=๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

if (foo === null || foo === undefined) {
  console.log('foo is null or undefined');
}

if (foo == null) {
  console.log('foo is null or undefined'); // true
}

4.9.6 Type and non-nullability assertions

TypeScript์˜ ํƒ€์ž… ๋‹จ์–ธ(type assertions)๊ณผ null ๋ถˆ๊ฐ€๋Šฅ์„ฑ ๋‹จ์–ธ(non-nullability assertions)์„ ์‹ ์ค‘ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.

ํƒ€์ž… ๋‹จ์–ธ ์‹œ, as ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ผ:
<Foo>์™€ ๊ฐ™์€ ์•ต๊ธ€ ๋ธŒ๋ž˜ํ‚ท ๋ฌธ๋ฒ•์€ ํ˜ผ๋ž€์„ ์ค„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ง€์–‘ํ•œ๋‹ค.
as๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉค๋ฒ„ ์ ‘๊ทผ ์‹œ ๋ช…ํ™•์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ๊ด„ํ˜ธ๊ฐ€ ์ถ”๊ฐ€๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

Before

const x = (<Foo>z).length;
const y = <Foo>z.length; // ์˜คํ•ด์˜ ์†Œ์ง€๊ฐ€ ์žˆ์Œ

After

const x = (z as Foo).length; // ๊ด„ํ˜ธ๊ฐ€ ๋ช…ํ™•์„ฑ์„ ๋ณด์žฅ

ํƒ€์ž… ๋‹จ์–ธ๊ณผ null ๋ถˆ๊ฐ€๋Šฅ์„ฑ ๋‹จ์–ธ์€ ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•˜๋ผ:
ํƒ€์ž… ๋‹จ์–ธ (x as SomeType)๊ณผ null ๋ถˆ๊ฐ€๋Šฅ์„ฑ ๋‹จ์–ธ (y!)์€ ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ํŠน์ • ๊ฐ’์ด ์–ด๋–ค ํƒ€์ž…์ž„์„ ๊ฐ•์ œ๋กœ ์•Œ๋ฆฌ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.
ํ•˜์ง€๋งŒ ๋Ÿฐํƒ€์ž„์—์„œ๋Š” ์‹ค์ œ๋กœ ํƒ€์ž…์ด๋‚˜ null ์ฒดํฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ:

  • ์ž˜๋ชป๋œ ๋‹จ์–ธ์€ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹จ์–ธ์€ ๊ฐœ๋ฐœ์ž์˜ ์ฑ…์ž„์„ ๊ฐ€์ค‘์‹œํ‚ค๋ฉฐ ์ฝ”๋“œ ์•ˆ์ •์„ฑ์„ ๋–จ์–ด๋œจ๋ฆด ์ˆ˜ ์žˆ๋‹ค.

Before

const x: unknown = "hello";
console.log((x as number).toFixed(2)); // ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ ๋ฐœ์ƒ!

After
ํƒ€์ž… ์ฒดํฌ๋‚˜ null ์ฒดํฌ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ž‘์„ฑํ•˜๋ผ.

if (typeof x === "number") {
  console.log(x.toFixed(2)); // ์•ˆ์ „ํ•œ ์‹คํ–‰
}

ํƒ€์ž… ๋‹จ์–ธ์ด๋‚˜ null ๋ถˆ๊ฐ€๋Šฅ์„ฑ ๋‹จ์–ธ์„ ๋ฐ˜๋“œ์‹œ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๊ฒฝ์šฐ, ์ฃผ์„์„ ํ†ตํ•ด ํ•ด๋‹น ๋‹จ์–ธ์ด ์•ˆ์ „ํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•œ ์ด์œ ๋ฅผ ๊ธฐ๋กํ•œ๋‹ค. (๋ช…๋ฐฑํ•œ ๊ฒฝ์šฐ์—๋Š” ์ฃผ์„์ด ์ƒ๋žต ๊ฐ€๋Šฅํ•˜๋‹ค.)

// x๋Š” Foo ํƒ€์ž…์ž„์ด ๋ณด์žฅ๋œ๋‹ค (์–ด๋–ค ์ด์œ  ๋•Œ๋ฌธ์ธ์ง€ ๋ช…์‹œ).
(x as Foo).foo();

// y๋Š” null์ด ๋  ์ˆ˜ ์—†์Œ์„ ์•Œ๊ณ  ์žˆ๋‹ค (ํ•ด๋‹น ์ƒํ™ฉ ์„ค๋ช…).
y!.bar();

์ด์ค‘ ๋‹จ์–ธ๋ฌธ (Double Assertions)
TypeScript๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ "๋” ๊ตฌ์ฒด์ ์ด๊ฑฐ๋‚˜ ๋” ์ผ๋ฐ˜์ ์ธ ํƒ€์ž…"์œผ๋กœ์˜ ๋‹จ์–ธ๋งŒ ํ—ˆ์šฉํ•œ๋‹ค.
์•ˆ์ „ํ•˜๋‹ค๊ณ  ํ™•์‹ ํ•˜๋Š” ๊ฒฝ์šฐ, ์ด์ค‘ ๋‹จ์–ธ๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
์ค‘๊ฐ„ ํƒ€์ž…์œผ๋กœ any๋‚˜ {} ๋Œ€์‹  unknown์„ ๊ถŒ์žฅํ•œ๋‹ค.
Before

(x as any as Foo).fooMethod();

After

(x as unknown as Foo).fooMethod();

๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์—๋Š” ํƒ€์ž… ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์—๋Ÿฌ๋ฅผ ์‚ฌ์ „์— ๋ฐฉ์ง€ํ•˜๋ผ:
๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์—์„œ๋Š” ํƒ€์ž… ๋‹จ์–ธ (as Foo) ๋Œ€์‹  ํƒ€์ž… ์–ด๋…ธํ…Œ์ด์…˜ (: Foo) ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•œ๋‹ค.
ํƒ€์ž… ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ์ธํ„ฐํŽ˜์ด์Šค ๋ณ€๊ฒฝ ์‹œ ์ž˜๋ชป๋œ ํ•„๋“œ๊ฐ€ ์ž๋™์œผ๋กœ ๊ฐ์ง€๋œ๋‹ค.
Before

interface Foo {
  bar: number;
  baz?: string;
}

const foo = {
  bar: 123,
  bam: 'abc', // ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ!
} as Foo;

After

interface Foo {
  bar: number;
  baz?: string;
}

const foo: Foo = {
  bar: 123,
  bam: 'abc', // bam์ด Foo์— ์ •์˜๋˜์ง€ ์•Š์•˜๋‹ค๊ณ  ์—๋Ÿฌ ๋ฐœ์ƒ
};

4.9.7 Keep try blocks focused

try ๋ธ”๋ก์— ํฌํ•จ๋œ ์ฝ”๋“œ๋Š” ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค:
์–ด๋–ค ์ฝ”๋“œ๊ฐ€ ์˜ˆ์™ธ๋ฅผ ๋˜์งˆ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š”์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ๋“œ๋Ÿฌ๋‚˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.

Before

try {
  const result = methodThatMayThrow(); // ์˜ˆ์™ธ๋ฅผ ๋˜์งˆ ๊ฐ€๋Šฅ์„ฑ ์žˆ์Œ
  use(result);                         // ์˜ˆ์™ธ๋ฅผ ๋˜์ง€์ง€ ์•Š์Œ
} catch (error: unknown) {
  // ...
}
  • use(result)๋Š” ์˜ˆ์™ธ๋ฅผ ๋˜์ง€์ง€ ์•Š์ง€๋งŒ try ๋ธ”๋ก ์•ˆ์— ํฌํ•จ๋˜์–ด ์žˆ์–ด ๋…์ž์—๊ฒŒ ํ˜ผ๋ž€์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค.
    After
let result;
try {
  result = methodThatMayThrow(); // ์˜ˆ์™ธ๋ฅผ ๋˜์งˆ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ์ฝ”๋“œ๋งŒ ํฌํ•จ
} catch (error: unknown) {
  // ...
}
use(result); // ์˜ˆ์™ธ๋ฅผ ๋˜์ง€์ง€ ์•Š๋Š” ์ฝ”๋“œ๋Š” `try` ๋ธ”๋ก ๋ฐ–์œผ๋กœ ์ด๋™
  • ์ด์ œ ๋…์ž๊ฐ€ methodThatMayThrow()๋งŒ ์˜ˆ์™ธ๋ฅผ ๋˜์งˆ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Œ์„ ๋ช…ํ™•ํžˆ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
try {
  use(methodThatMayThrow()); // ์ฝ”๋“œ๊ฐ€ ๊ฐ„๋‹จํ•˜๋ฏ€๋กœ ๋ณ„๋„๋กœ ๋‚˜๋ˆŒ ํ•„์š” ์—†์Œ
} catch (error: unknown) {
  // ...
}

๋ฃจํ”„ ์•ˆ์— try ๋ธ”๋ก์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ์„ ์–ธํ•˜๋ฉด ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค:
์ด ๊ฒฝ์šฐ, try ๋ธ”๋ก์˜ ๋ฒ”์œ„๋ฅผ ๋ฃจํ”„ ์ „์ฒด๋กœ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์ด ๋‚ซ๋‹ค.
Before

for (const item of items) {
  try {
    processItem(item); // ๋งค๋ฒˆ `try` ๋ธ”๋ก์ด ์žฌ์ƒ์„ฑ๋จ
  } catch (error: unknown) {
    // ...
  }
}

After

try {
  for (const item of items) {
    processItem(item); // `try` ๋ธ”๋ก์ด ํ•œ ๋ฒˆ๋งŒ ์ƒ์„ฑ๋จ
  }
} catch (error: unknown) {
  // ...
}

4.10 Decorators

๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” ํด๋ž˜์Šค, ๋ฉ”์„œ๋“œ, ํ•„๋“œ, ๋˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜, ๋™์ž‘์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ํŠน์ˆ˜ํ•œ ๋ฌธ๋ฒ•์ด๋‹ค.
๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” @ ๊ธฐํ˜ธ๋กœ ์‹œ์ž‘ํ•˜๋ฉฐ, ํ•จ์ˆ˜ ํ˜•ํƒœ๋กœ ์ •์˜๋œ๋‹ค.

@Component({
  selector: 'my-component',
  template: '<p>My Component</p>',
})
class MyComponent {}

์ƒˆ๋กœ์šด ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์ •์˜ํ•˜์ง€ ๋ง๊ณ , ํ”„๋ ˆ์ž„์›Œํฌ ์ œ๊ณต ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋งŒ ์‚ฌ์šฉํ•˜๋ผ:
๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” TypeScript์—์„œ ์‹คํ—˜์ (Experimental)์œผ๋กœ ๋„์ž…๋˜์—ˆ๋‹ค.
ํ•˜์ง€๋งŒ JavaScript ํ‘œ์ค€ํ™” ๊ธฐ๊ตฌ์ธ TC39์˜ ์ตœ์ข… ํ‘œ์ค€์•ˆ๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋Š” ๋ถ€๋ถ„์ด ์žˆ๋‹ค.
์‹คํ—˜์  ๊ธฐ๋Šฅ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฏธ ๋ฐœ๊ฒฌ๋œ ๋ช‡ ๊ฐ€์ง€ ๋ฒ„๊ทธ๋“ค์ด ์ˆ˜์ •๋˜์ง€ ์•Š์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค.
์ด๋Ÿฐ ์ด์œ ๋กœ ์ƒˆ๋กœ์šด ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์ •์˜ํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์œ„ํ—˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ณต์‹ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” ๋นˆ ์ค„ ์—†์ด ๋ฐ”๋กœ ์ ์šฉ ๋Œ€์ƒ ์•ž์— ์œ„์น˜์‹œ์ผœ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์—ฌ๋ผ:
Before

/** JSDoc comments */
@Component({...}) 

class MyComponent {}  // ๋นˆ ์ค„์ด ์žˆ์–ด์„œ ์ž˜๋ชป๋œ ์˜ˆ

After

/** JSDoc comments */
@Component({...})
class MyComponent {}  // ๋นˆ ์ค„ ์—†์ด ๋ฐ”๋กœ ์—ฐ๊ฒฐ
class MyComp {
  @Input() myField: string;  // ๊ฐ™์€ ์ค„
  @Input()
  myOtherField: string;  // ๋‹ค์Œ ์ค„๋กœ ๊ฐ์‹ธ๊ธฐ
}
  • ํ•„๋“œ์— ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ๋ถ™์ผ ๋•Œ๋Š” ๊ฐ™์€ ์ค„์— ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ ๋‹ค์Œ ์ค„๋กœ ๊ฐ์‹ธ๋Š” ๋ฐฉ์‹ ๋ชจ๋‘ ํ—ˆ์šฉ๋œ๋‹ค.

4.11 Disallowed features

4.11.1 Wrapper objects for primitive types

๋ž˜ํผ ํด๋ž˜์Šค(wrapper class)๋Š” JavaScript์˜ ์›์‹œ ํƒ€์ž…(String, Boolean, Number)์„ ๊ฐ์ฒด๋กœ ๊ฐ์‹ธ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, String, Boolean, Number๋Š” ๊ฐ๊ฐ ์›์‹œ ํƒ€์ž…์„ ๊ฐ์ฒด์ฒ˜๋Ÿผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์ค€๋‹ค.

const s = new String('hello');  // ๋ฌธ์ž์—ด 'hello'๋ฅผ String ๊ฐ์ฒด๋กœ ๊ฐ์Œˆ
const b = new Boolean(false);  // ๋ถˆ๋ฆฌ์–ธ false๋ฅผ Boolean ๊ฐ์ฒด๋กœ ๊ฐ์Œˆ
const n = new Number(5);       // ์ˆซ์ž 5๋ฅผ Number ๊ฐ์ฒด๋กœ ๊ฐ์Œˆ

์›์‹œ ํƒ€์ž…์„ ๊ฐ์‹ธ๋Š” ๋ž˜ํผ ํด๋ž˜์Šค๋ฅผ ์ง์ ‘ ์ธ์Šคํ„ด์Šคํ™”ํ•˜์ง€ ๋ง์ž:
๋ž˜ํผ ํด๋ž˜์Šค๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๋ฉด ์›์‹œ ๊ฐ’์ด ์•„๋‹ˆ๋ผ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.
์ด๋กœ ์ธํ•ด ์˜๋„์™€ ๋‹ค๋ฅธ ๋™์ž‘์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
์›์‹œ ํƒ€์ž…์„ ๊ฐ์ฒด๋กœ ๊ฐ์‹ธ๋Š” ๊ฒƒ์€ ๋ฉ”๋ชจ๋ฆฌ์™€ ์„ฑ๋Šฅ ์ธก๋ฉด์—์„œ ๋ถˆํ•„์š”ํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.
์›์‹œ ํƒ€์ž… ์ž์ฒด๋Š” ๊ฐ€๋ณ๊ณ  ๋น ๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ๋‹ค.

Before

const b = new Boolean(false);
console.log(b);  // Boolean {false}
console.log(b == true);  // true
console.log(b ? 'true' : 'false');  // 'true'

new Boolean(false)๋Š” ๋ถˆ๋ฆฌ์–ธ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ๊ฐ์ฒด๋Š” ํ•ญ์ƒ true๋กœ ํ‰๊ฐ€๋œ๋‹ค.
์ฆ‰, ์‹ค์ œ ๊ฐ’์ด false์ž„์—๋„ true๋กœ ํ‰๊ฐ€๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

const s1 = 'hello';
const s2 = new String('hello');

console.log(s1 === s2);  // false (๋ฌธ์ž์—ด vs ๊ฐ์ฒด)
console.log(s1 == s2);   // true (๋А์Šจํ•œ ๋น„๊ต๋กœ ๋™๋“ฑํ•˜๋‹ค๊ณ  ํ‰๊ฐ€)

After

const s = 'hello';  // ์›์‹œ ๋ฌธ์ž์—ด
const b = false;    // ์›์‹œ ๋ถˆ๋ฆฌ์–ธ
const n = 5;        // ์›์‹œ ์ˆซ์ž
const s = String('hello');  // ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜
const b = Boolean(0);       // ๋ถˆ๋ฆฌ์–ธ์œผ๋กœ ๋ณ€ํ™˜
const n = Number('42');     // ์ˆซ์ž๋กœ ๋ณ€ํ™˜
  • ํƒ€์ž… ๊ฐ•์ œ ๋ณ€ํ™˜์€ ๋ž˜ํผ ํด๋ž˜์Šค ํ•จ์ˆ˜ ํ˜ธ์ถœ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.
  • ์ด๋Š” +, ''์™€ ๊ฐ™์€ ๋น„๊ถŒ์žฅ ๋ฐฉ์‹๋ณด๋‹ค ๋ช…์‹œ์ ์ด๊ณ  ์•ˆ์ „ํ•˜๋‹ค.

4.11.2 Automatic Semicolon Insertion

๋ชจ๋“  ๋ฌธ์žฅ์„ ์„ธ๋ฏธ์ฝœ๋ก ์œผ๋กœ ๋ช…์‹œ์ ์œผ๋กœ ๋๋‚ด์•ผ ํ•œ๋‹ค.
์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ž˜๋ชป๋œ ์„ธ๋ฏธ์ฝœ๋ก  ์‚ฝ์ž…์œผ๋กœ ์ธํ•œ ๋ฒ„๊ทธ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ASI ์ง€์›์ด ์ œํ•œ๋œ ๋„๊ตฌ(์˜ˆ: clang-format)์™€์˜ ํ˜ธํ™˜์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค.


4.11.3 Const enums

const enum์„ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค:
const enum์€ ์ปดํŒŒ์ผ ๊ฒฐ๊ณผ์—์„œ ์‚ฌ๋ผ์ง€๋ฏ€๋กœ, JavaScript๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋‚˜ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ ์ด ์—ด๊ฑฐํ˜•์„ ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋‹ค. ๋งŒ์•ฝ const enum์„ ์‚ฌ์šฉํ•œ TypeScript ์ฝ”๋“œ๊ฐ€ JavaScript ๋ชจ๋“ˆ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ๋  ๊ฒฝ์šฐ, ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
const enum์€ ๊ฐ’์ด ์ธ๋ผ์ธ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋””๋ฒ„๊น… ๊ณผ์ •์—์„œ ์—ด๊ฑฐํ˜• ์ด๋ฆ„์„ ๋ณผ ์ˆ˜ ์—†๋‹ค. ์ด๋Š” ๋””๋ฒ„๊น… ์ •๋ณด๋ฅผ ์žƒ๊ฒŒ ๋งŒ๋“ค๊ณ , ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์–ด๋ ต๊ฒŒ ํ•œ๋‹ค. ๋˜ํ•œ ์—ด๊ฑฐํ˜•์˜ ๊ฐ’์ด ์—ฌ๋Ÿฌ ๊ณณ์— ์ธ๋ผ์ธ์œผ๋กœ ์‚ฝ์ž…๋˜๋ฉด, ์—ด๊ฑฐํ˜• ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ ์ปดํŒŒ์ผ๋œ JavaScript์˜ ๋ชจ๋“  ์ฐธ์กฐ๋ฅผ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•ด์•ผ ํ•œ๋‹ค.
const ์—ด๊ฑฐํ˜•์€ ๋ชจ๋“ˆ์˜ JavaScript ์‚ฌ์šฉ์ž์—๊ฒŒ ์—ด๊ฑฐํ˜•์„ ๋ณด์ด์ง€ ์•Š๊ฒŒ ํ•˜๋Š” ์ตœ์ ํ™”์™€ ๊ด€๋ จ๋œ ๋ณ„๋„์˜ ์–ธ์–ด ๊ธฐ๋Šฅ์ด๋ฉฐ, JavaScript ํ‘œ์ค€์ด ์•„๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ ํ™˜๊ฒฝ์—์„œ ํ˜ธํ™˜๋˜์ง€ ์•Š์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค.

enum:

enum Color {
  Red,
  Green,
  Blue,
}

console.log(Color.Red);  // ์ถœ๋ ฅ: 0

์ปดํŒŒ์ผ ํ›„ JavaScript:

var Color;
(function (Color) {
  Color[Color["Red"] = 0] = "Red";
  Color[Color["Green"] = 1] = "Green";
  Color[Color["Blue"] = 2] = "Blue";
})(Color || (Color = {}));

console.log(Color.Red);  // ์ถœ๋ ฅ: 0

const enum:

const enum Color {
  Red,
  Green,
  Blue,
}

console.log(Color.Red);  // ์ถœ๋ ฅ: 0

์ปดํŒŒ์ผ ํ›„ JavaScript:

console.log(0);  // `Color.Red`๊ฐ€ ์ƒ์ˆ˜๋กœ ๋Œ€์ฒด๋จ

4.11.4 Debugger statements

debugger๋ฌธ์€ ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ์— ํฌํ•จ๋˜์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค.
debugger๋Š” JavaScript์—์„œ ๋””๋ฒ„๊น…์„ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๋ช…๋ น์–ด๋กœ, ์ฝ”๋“œ ์‹คํ–‰์„ ์ค‘๋‹จํ•˜๊ณ  ๋””๋ฒ„๊น… ์„ธ์…˜์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š”๋‹ค.
์ด ๋ช…๋ น์–ด๋Š” ์ฃผ๋กœ ๋ธŒ๋ผ์šฐ์ €์˜ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋‚˜ Node.js์˜ ๋””๋ฒ„๊น… ๋ชจ๋“œ์—์„œ ์‹คํ–‰๋  ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋œ๋‹ค.

function debugMe() {
  debugger;  // ๋””๋ฒ„๊ฑฐ๊ฐ€ ํ™œ์„ฑํ™”๋œ ์ƒํƒœ์—์„œ ์‹คํ–‰ ์‹œ, ์ฝ”๋“œ๊ฐ€ ์ค‘๋‹จ๋œ๋‹ค.
  console.log("This will not run unless debugger is removed.");
}

debugger๋Š” ์ฝ”๋“œ ์‹คํ–‰์„ ์ค‘๋‹จ์‹œํ‚ค๋ฏ€๋กœ, ์‚ฌ์šฉ์ž๊ฐ€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‚ฌ์šฉํ•  ๋•Œ ์˜ˆ๊ธฐ์น˜ ์•Š๊ฒŒ ํŽ˜์ด์ง€๊ฐ€ ๋ฉˆ์ถ”๊ฑฐ๋‚˜ ๋™์ž‘์ด ์ค‘๋‹จ๋  ์ˆ˜ ์žˆ๋‹ค.
ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” ๋””๋ฒ„๊น…์„ ์œ„ํ•œ ์ฝ”๋“œ ์‹คํ–‰ ์ค‘๋‹จ์ด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๋ฐฉํ•ดํ•˜๊ฑฐ๋‚˜ ์„œ๋น„์Šค์˜ ๊ฐ€์šฉ์„ฑ์— ์•…์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋‹ค.

debugger ๋ฌธ์ด ์ฝ”๋“œ์— ๋‚จ์•„ ์žˆ์œผ๋ฉด, ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋„ ๋””๋ฒ„๊น…์„ ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ๋กœ ๋‚จ๊ฒŒ ๋œ๋‹ค. ์ด๋Š” ๋ณด์•ˆ ์œ„ํ—˜์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
๊ณต๊ฒฉ์ž๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋ฅผ ํ†ตํ•ด ๋””๋ฒ„๊ฑฐ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ๋ฅผ ์ถ”์ ํ•˜๊ฑฐ๋‚˜ ์•…์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
ํŠนํžˆ, ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๋””๋ฒ„๊น… ์ฝ”๋“œ๊ฐ€ ๋ณด์•ˆ ์ทจ์•ฝ์ ์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฐฐํฌ ํ›„ ๋””๋ฒ„๊น…์€ ์‹ค์ œ ์ฝ”๋“œ์— debugger๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๋Œ€์‹ , ๋กœ๊ทธ ํŒŒ์ผ์ด๋‚˜ ์—๋Ÿฌ ์ถ”์  ์‹œ์Šคํ…œ์„ ํ™œ์šฉํ•˜์—ฌ ๋””๋ฒ„๊น…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.


4.11.5 with

with ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ ๊ธˆ์ง€:
์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค๊ณ  ES5 ์ดํ›„๋กœ strict ๋ชจ๋“œ์—์„œ ๊ธˆ์ง€๋˜์—ˆ๋‹ค.


4.11.6 Dynamic code evaluation

eval์ด๋‚˜ Function(...string) ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉ ๊ธˆ์ง€(์ฝ”๋“œ ๋กœ๋” ์ œ์™ธ).
์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์€ ์ž ์žฌ์ ์œผ๋กœ ์œ„ํ—˜ํ•˜๋ฉฐ ์—„๊ฒฉํ•œ ์ฝ˜ํ…์ธ  ๋ณด์•ˆ ์ •์ฑ…์„ ์‚ฌ์šฉํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ๋Š” ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค.

const userInput = "alert('Hacked!')";
eval(userInput);  // ์œ„ํ—˜: ์‚ฌ์šฉ์ž๊ฐ€ ์•…์˜์ ์ธ ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ์Œ

const userInput = "alert('Malicious code')";
const fn = new Function(userInput);
fn();  // ์œ„ํ—˜: ์•…์˜์ ์ธ ์ฝ”๋“œ ์‹คํ–‰

4.11.7 Non-standard features

ํ‘œ์ค€ํ™”๋œ ECMAScript ๋ฐ Web Platform ๊ธฐ๋Šฅ๋งŒ ์‚ฌ์šฉํ•˜์ž:
๋น„ํ‘œ์ค€ ECMAScript๋‚˜ ์›น ํ”Œ๋žซํผ ๊ธฐ๋Šฅ์œผ๋กœ ๊ฐ„์ฃผ๋˜๋Š” ๊ฒƒ๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ๊ตฌ์‹ ๊ธฐ๋Šฅ ๋˜๋Š” ๋” ์ด์ƒ ์ง€์›๋˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ
  • ํ‘œ์ค€ํ™”๋˜์ง€ ์•Š์€ ์ƒˆ๋กœ์šด ECMAScript ๊ธฐ๋Šฅ
  • ํ˜„์žฌ TC39 ์ž‘์—… ์ดˆ์•ˆ์ด๋‚˜ ์ œ์•ˆ ์ค‘์ธ ๊ธฐ๋Šฅ
  • ์ œ์•ˆ๋˜์—ˆ์ง€๋งŒ ์•„์ง ์™„์„ฑ๋˜์ง€ ์•Š์€ ์›น ํ‘œ์ค€
  • ์™ธ๋ถ€ ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ ํ™•์žฅ ๊ธฐ๋Šฅ
  • ํŠน์ • JavaScript ๋Ÿฐํƒ€์ž„์„ ํƒ€๊ฒŸํŒ…ํ•˜๋Š” API ์‚ฌ์šฉ

4.11.8 Modifying builtin objects

๋‚ด์žฅ ํƒ€์ž…์„ ์ˆ˜์ •ํ•˜์ง€ ๋งˆ๋ผ:
JavaScript์—๋Š” ๋‚ด์žฅ๋œ ํƒ€์ž…๋“ค, ์˜ˆ๋ฅผ ๋“ค์–ด Array, Object, String, Number, Boolean, Function ๋“ฑ์ด ์žˆ๋‹ค.

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

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

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

๊ธ€๋กœ๋ฒŒ ๊ฐ์ฒด์— ์‹ฌ๋ณผ์„ ์ถ”๊ฐ€ํ•˜์ง€ ๋งˆ๋ผ:
๊ธ€๋กœ๋ฒŒ ๊ฐ์ฒด๋Š” JavaScript ์‹คํ–‰ ํ™˜๊ฒฝ์—์„œ ์ „์—ญ์ ์œผ๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” window, Node.js์—์„œ๋Š” global ๊ฐ์ฒด๊ฐ€ ํ•ด๋‹น๋œ๋‹ค. ์ด ๊ทœ์น™์€ ๊ธ€๋กœ๋ฒŒ ๊ฐ์ฒด์— ์‹ฌ๋ณผ์ด๋‚˜ ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜์ง€ ๋ง๊ณ , ์ถ”๊ฐ€๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด ๊ผญ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ํ•˜๋ผ๋Š” ๊ฒƒ์ด๋‹ค.

๊ธ€๋กœ๋ฒŒ ๊ฐ์ฒด๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด ๋ชจ๋“  ์ฝ”๋“œ์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค. ์—ฌ๊ธฐ์— ์‹ฌ๋ณผ์ด๋‚˜ ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋ฉด, ์ „์—ญ ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์ด ์ถฉ๋Œํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•„์ง€๋ฉฐ, ์ด๋Š” ์ฝ”๋“œ์˜ ์˜ˆ๊ธฐ์น˜ ๋ชปํ•œ ๋™์ž‘์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ํŠนํžˆ, ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž์™€ ํ˜‘์—…ํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.

๊ธ€๋กœ๋ฒŒ ๊ฐ์ฒด์— ๋ถˆํ•„์š”ํ•œ ์‹ฌ๋ณผ์ด๋‚˜ ์†์„ฑ์ด ๋งŽ์ด ์ถ”๊ฐ€๋˜๋ฉด, ์ฝ”๋“œ์˜ ๋ณต์žก์„ฑ์ด ์ฆ๊ฐ€ํ•˜๊ณ , ์„ฑ๋Šฅ์—๋„ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ํŠนํžˆ ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.

๊ธ€๋กœ๋ฒŒ ๊ฐ์ฒด์— ์˜๋„์น˜ ์•Š์€ ์†์„ฑ์ด ์ถ”๊ฐ€๋˜๋ฉด, ๋””๋ฒ„๊น…ํ•  ๋•Œ ํ˜ผ๋ž€์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์–ด๋–ค ์ฝ”๋“œ์—์„œ ํ•ด๋‹น ์‹ฌ๋ณผ์„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ถ”์ ์ด ์–ด๋ ต๋‹ค.

๊ธ€๋กœ๋ฒŒ ๊ฐ์ฒด์— ์‹ฌ๋ณผ์„ ์ถ”๊ฐ€ํ•  ๋•Œ๋Š” ๋ฐ˜๋“œ์‹œ ๊ทธ ์ด์œ ๋ฅผ ๋ช…ํ™•ํžˆ ํ•˜๊ณ , ์™ธ๋ถ€์—์„œ ์ด ์‹ฌ๋ณผ์— ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ๊ฐ€๋Šฅ์„ฑ์„ ์ตœ์†Œํ™”ํ•ด์•ผ ํ•œ๋‹ค.


profile
์•ˆ๋“œ๋กœ์ด๋“œ ํŽ˜ํŽ˜

0๊ฐœ์˜ ๋Œ“๊ธ€