ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํ˜•๋ณ€ํ™˜์˜ ๋ชจ๋“  ๊ฒƒ: ์™„๋ฒฝ ์ •๋ณต ๊ฐ€์ด๋“œ

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํ˜•๋ณ€ํ™˜์˜ ๋ชจ๋“  ๊ฒƒ: ์™„๋ฒฝ ์ •๋ณต ๊ฐ€์ด๋“œ

D
dongAuthor
5 min read

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํƒ€์ž…์„ ์ œ๋Œ€๋กœ ์ถ”๋ก ํ•˜์ง€ ๋ชปํ•˜๊ฑฐ๋‚˜, ๊ฐœ๋ฐœ์ž๊ฐ€ ๋” ์ •ํ™•ํ•œ ํƒ€์ž…์„ ์•Œ๊ณ  ์žˆ์„ ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. DHH(David Heinemeier Hansson)๊ฐ€ hotwired/turbo ํ”„๋กœ์ ํŠธ์—์„œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด์„œ "ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ •๋ง ํ•„์š”ํ•œ๊ฐ€?"์— ๋Œ€ํ•œ ๋…ผ์Ÿ์ด ๋‹ค์‹œ ๋ถˆ๋ถ™๊ธฐ๋„ ํ–ˆ์ฃ . ํ•˜์ง€๋งŒ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ์ •์  ํƒ€์ž… ์‹œ์Šคํ…œ์ด ์ฃผ๋Š” ์•ˆ์ •์„ฑ์€ ์—ฌ์ „ํžˆ ๋งค๋ ฅ์ ์ž…๋‹ˆ๋‹ค.

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํ‡ด์ถœ?

์ด๋Ÿฌํ•œ ํƒ€์ž… ์‹œ์Šคํ…œ์„ ๋” ์œ ์—ฐํ•˜๊ณ  ๊ฐ•๋ ฅํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ ค๋ฉด โ€˜ํ˜•๋ณ€ํ™˜(Type Casting)โ€™ ๋˜๋Š” 'ํƒ€์ž… ๋‹จ์–ธ(Type Assertion)'์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ๋‹ค์–‘ํ•œ ํ˜•๋ณ€ํ™˜ ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๊ณ , ๊ฐ ์ƒํ™ฉ์— ๋งž๋Š” ์ตœ์ ์˜ ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•˜๋Š” ๊ธฐ์ค€์„ ์ œ์‹œํ•ด ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๋จผ์ € ์ค‘์š”ํ•œ ์ ์„ ์งš๊ณ  ๋„˜์–ด๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ํ˜•๋ณ€ํ™˜์€ ๋Ÿฐํƒ€์ž„์— ๊ฐ’์˜ ์‹ค์ œ ํ˜•ํƒœ๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์˜ค์ง ์ปดํŒŒ์ผ ํƒ€์ž„์— ํƒ€์ž… ๊ฒ€์‚ฌ๊ธฐ์—๊ฒŒ "์ด ๊ฐ’์€ ๋‚ด๊ฐ€ ๋ช…์‹œํ•˜๋Š” ์ด ํƒ€์ž…์œผ๋กœ ๊ฐ„์ฃผํ•ด ์ค˜"๋ผ๊ณ  ์•Œ๋ ค์ฃผ๋Š” ํ–‰์œ„์ž…๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„ ์ฝ”๋“œ์—๋Š” ์•„๋ฌด๋Ÿฐ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์ฃ .

as: ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ํƒ€์ž… ๋‹จ์–ธ

as ํ‚ค์›Œ๋“œ๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ ๊ฐ€์žฅ ํ”ํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๋Š” ํƒ€์ž… ๋‹จ์–ธ ๋ฌธ๋ฒ•์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ์ปดํŒŒ์ผ๋Ÿฌ๋ณด๋‹ค ํƒ€์ž…์„ ๋” ์ž˜ ์•Œ๊ณ  ์žˆ์„ ๋•Œ ํ™•์‹ ์„ ๊ฐ€์ง€๊ณ  ํƒ€์ž…์„ ์ง€์ •ํ•ด ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ any๋‚˜ unknown์ฒ˜๋Ÿผ ํƒ€์ž… ์ •๋ณด๊ฐ€ ์—†๋Š” ๊ฐ’์„ ๊ตฌ์ฒด์ ์ธ ํƒ€์ž…์œผ๋กœ ๋‹ค๋ฃฐ ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

interface Hero {
  name: string;
  age: number;
}

const capt = {} as Hero; // ๋นˆ ๊ฐ์ฒด๋ฅผ Hero ํƒ€์ž…์œผ๋กœ ๋‹จ์–ธ
capt.name = '์บกํ‹ด';
capt.age = 100;

์ฐธ๊ณ ๋กœ, JSX(TSX)์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๊บพ์‡  ๊ด„ํ˜ธ(<Type>) ๋ฌธ๋ฒ•์ด JSX ํƒœ๊ทธ์™€ ํ˜ผ๋™๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, as ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ‘œ์ค€์ฒ˜๋Ÿผ ๊ตณ์–ด์กŒ์Šต๋‹ˆ๋‹ค. ๊ผญ ๊ธฐ์–ตํ•ด๋‘์„ธ์š”!

as const: ๊ฐ’์„ ๋ฆฌํ„ฐ๋Ÿด ํƒ€์ž…์œผ๋กœ ๊ณ ์ •ํ•˜๊ธฐ

as const๋Š” ๋ณ€์ˆ˜๋‚˜ ๊ฐ์ฒด๋ฅผ ๋งˆ์น˜ const๋กœ ์„ ์–ธํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋งŒ๋“ค์–ด, ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ๋ฅผ readonly๋กœ ๋ฐ”๊พธ๊ณ  ๊ฐ’์„ ์•„์ฃผ ๊ตฌ์ฒด์ ์ธ ๋ฆฌํ„ฐ๋Ÿด ํƒ€์ž…์œผ๋กœ ๊ณ ์ •ํ•ฉ๋‹ˆ๋‹ค.

// ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ, 'direction'์˜ ํƒ€์ž…์€ 'string'์œผ๋กœ ์ถ”๋ก ๋ฉ๋‹ˆ๋‹ค.
let direction = "left"; 

// 'as const'๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํƒ€์ž…์ด "left"๋ผ๋Š” ๋ฆฌํ„ฐ๋Ÿด ํƒ€์ž…์œผ๋กœ ๊ณ ์ •๋ฉ๋‹ˆ๋‹ค.
const directionConst = "left" as const;
// directionConst์˜ ํƒ€์ž…: "left"

const config = {
  method: "GET",
  cache: false,
} as const;

/*
config์˜ ํƒ€์ž…: 
{ 
  readonly method: "GET"; 
  readonly cache: false; 
}
*/

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์‹ค์ˆ˜๋กœ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์„ ๋ง‰์„ ์ˆ˜ ์žˆ๊ณ , ํŠน์ • ๋ฌธ์ž์—ด ๊ฐ’๋งŒ ํ—ˆ์šฉํ•˜๋Š” ํ•จ์ˆ˜์— ์ธ์ž๋กœ ๋„˜๊ธธ ๋•Œ ํƒ€์ž… ์•ˆ์ •์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

!: Non-null ๋‹จ์–ธ ์—ฐ์‚ฐ์ž

! ์—ฐ์‚ฐ์ž๋Š” ํŠน์ • ๊ฐ’์ด null์ด๋‚˜ undefined๊ฐ€ ์ ˆ๋Œ€ ์•„๋‹ˆ๋ผ๊ณ  ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ๊ฐ•ํ•˜๊ฒŒ ์ฃผ์žฅํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. DOM ์š”์†Œ์— ์ ‘๊ทผํ•  ๋•Œ์ฒ˜๋Ÿผ, ๊ฐœ๋ฐœ์ž๋Š” ํ•ด๋‹น ์š”์†Œ๊ฐ€ ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•œ๋‹ค๊ณ  ํ™•์‹ ํ•˜๋Š” ์ƒํ™ฉ์—์„œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

// ์ปดํŒŒ์ผ๋Ÿฌ๋Š” querySelector๊ฐ€ null์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฒฝ๊ณ ํ•ฉ๋‹ˆ๋‹ค.
const el = document.querySelector("input")!; // '!'๋กœ null์ด ์•„๋‹˜์„ ๋‹จ์–ธ
el.focus(); // ์ด์ œ el์ด null์ด ์•„๋‹ˆ๋ผ๊ณ  ๊ฐ„์ฃผํ•˜๋ฏ€๋กœ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด ๋ฐฉ๋ฒ•์€ ์‹ ์ค‘ํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋Ÿฐํƒ€์ž„์— ์‹ค์ œ๋กœ ๊ฐ’์ด null์ด๋ผ๋ฉด, ์ฝ”๋“œ๋Š” ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋ฉฐ ๋ฉˆ์ถ”๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. !๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์œ ์šฉํ•œ ๊ฒฝ๊ณ ๋ฅผ ๋ฌด์‹œํ•˜๋Š” ํ–‰์œ„์ด๋ฏ€๋กœ, ์ •๋ง 100% ํ™•์‹ ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์—์„œ๋งŒ ์ œํ•œ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

satisfies: ํƒ€์ž…์€ ์ง€ํ‚ค๊ณ  ์ถ”๋ก ์€ ์‚ด๋ฆฌ๊ณ 

ES2022์— ๋„์ž…๋œ satisfies ์—ฐ์‚ฐ์ž๋Š” as์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•˜๋Š” ์•„์ฃผ ๋˜‘๋˜‘ํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฐ’์ด ํŠน์ • ํƒ€์ž…์„ "๋งŒ์กฑ(satisfy)"ํ•˜๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๋ฉด์„œ๋„, ๊ฐ’ ์ž์ฒด์˜ ๊ตฌ์ฒด์ ์ธ ๋ฆฌํ„ฐ๋Ÿด ํƒ€์ž… ์ถ”๋ก ์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•ด ์ค๋‹ˆ๋‹ค.

as๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํƒ€์ž…์ด ๊ฐ•์ œ๋กœ ๊ณ ์ •๋˜์–ด ์›๋ž˜์˜ ๊ตฌ์ฒด์ ์ธ ํƒ€์ž… ์ •๋ณด๋ฅผ ์žƒ๊ฒŒ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ satisfies๋Š” ํƒ€์ž… ๊ฒ€์‚ฌ๋ฅผ ํ†ต๊ณผ์‹œํ‚ค๋ฉด์„œ๋„ ํƒ€์ž… ์ถ”๋ก ์˜ ์ด์ ์„ ๋ชจ๋‘ ๋ˆ„๋ฆฌ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

type Config = { method: "GET" | "POST"; url: string };

// 'as'๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ
const apiConfigAs = {
  method: "GET",
  url: "/users",
} as Config;
// apiConfigAs.method์˜ ํƒ€์ž…์€ "GET" | "POST"์œผ๋กœ ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค.

// 'satisfies'๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ
const apiConfigSatisfies = {
  method: "GET",
  url: "/users",
} satisfies Config;
// apiConfigSatisfies.method์˜ ํƒ€์ž…์€ "GET" ๋ฆฌํ„ฐ๋Ÿด ํƒ€์ž…์œผ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค!

๋งŒ์•ฝ ๊ฐ์ฒด์— Config ํƒ€์ž…์— ์—†๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด satisfies๋Š” ์ปดํŒŒ์ผ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ ์‹ค์ˆ˜๋ฅผ ๋ง‰์•„์ค๋‹ˆ๋‹ค. ์ด์ฒ˜๋Ÿผ ํƒ€์ž… ๊ฒ€์‚ฌ์™€ ํƒ€์ž… ์ถ”๋ก ์˜ ์žฅ์ ์„ ๋ชจ๋‘ ์ทจํ•˜๊ณ  ์‹ถ์„ ๋•Œ satisfies๋Š” ์ตœ๊ณ ์˜ ์„ ํƒ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ค‘ ๋‹จ์–ธ (Double Assertion)

์„œ๋กœ ๊ด€๋ จ ์—†๋Š” ํƒ€์ž…๋ผ๋ฆฌ๋Š” ์ง์ ‘ ํ˜•๋ณ€ํ™˜์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿด ๋•Œ unknown (๋˜๋Š” any)์„ ์ค‘๊ฐ„ ๋‹ค๋ฆฌ๋กœ ์‚ฌ์šฉํ•˜๋Š” โ€˜์ด์ค‘ ๋‹จ์–ธโ€™ ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const value: string = "123";

// ์˜ค๋ฅ˜: string ํƒ€์ž…์„ number ํƒ€์ž…์œผ๋กœ ์ง์ ‘ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
// const num = value as number; 

// ์ด์ค‘ ๋‹จ์–ธ: string -> unknown -> number
const num = value as unknown as number; // ์œ„ํ—˜ํ•˜์ง€๋งŒ, ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ํ†ต๊ณผํ•ฉ๋‹ˆ๋‹ค.

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

is: ์‚ฌ์šฉ์ž ์ •์˜ ํƒ€์ž… ๊ฐ€๋“œ๋กœ ํƒ€์ž… ์ขํžˆ๊ธฐ

์กฐ๊ฑด๋ฌธ์„ ์‚ฌ์šฉํ•ด ํƒ€์ž…์„ ์ขํžˆ๋Š” ๊ฒƒ์„ 'ํƒ€์ž… ๊ฐ€๋“œ(Type Guard)'๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. typeof, instanceof ๋“ฑ์ด ๋Œ€ํ‘œ์ ์ด์ฃ . ์—ฌ๊ธฐ์„œ ๋” ๋‚˜์•„๊ฐ€ is ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ์šฉ์ž ์ •์˜ ํƒ€์ž… ๊ฐ€๋“œ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณต์žกํ•œ ๊ฐ์ฒด์˜ ํƒ€์ž…์„ ํŒ๋ณ„ํ•˜๋Š” ๋กœ์ง์„ ํ•จ์ˆ˜๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ๊ฐ€๋…์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// 'value is string'์€ ์ด ํ•จ์ˆ˜๊ฐ€ true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด value์˜ ํƒ€์ž…์ด string์ž„์„ ๋ณด์žฅํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.
function isString(value: unknown): value is string {
  return typeof value === "string";
}

function print(value: unknown) {
  if (isString(value)) {
    // ์ด ๋ธ”๋ก ์•ˆ์—์„œ value๋Š” string ํƒ€์ž…์œผ๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ์ทจ๊ธ‰๋ฉ๋‹ˆ๋‹ค.
    console.log(value.toUpperCase()); 
  }
}

์ด์ฒ˜๋Ÿผ is๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋ณต์žกํ•œ ์กฐ๊ฑด๋ถ€ ํƒ€์ž… ๋กœ์ง์„ ๋ช…ํ™•ํ•˜๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋” ๋‚˜์€ ์ฝ”๋“œ๋ฅผ ์œ„ํ•œ ์ œ์–ธ

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ํ˜•๋ณ€ํ™˜์€ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ด์ง€๋งŒ, ๋‚จ์šฉํ•˜๋ฉด ํƒ€์ž… ์‹œ์Šคํ…œ์˜ ์žฅ์ ์„ ๋ฌด๋„ˆ๋œจ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. "๋‚˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๋ณด๋‹ค ๋˜‘๋˜‘ํ•˜๋‹ค"๋Š” ์ž์‹ ๊ฐ์ด ํ•„์š”ํ•  ๋•Œ๋„ ์žˆ์ง€๋งŒ, ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ปดํŒŒ์ผ๋Ÿฌ์˜ ๊ฒฝ๊ณ ์—๋Š” ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜•๋ณ€ํ™˜์„ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๋‹ค์Œ์„ ๋จผ์ € ๊ณ ๋ คํ•ด ๋ณด์„ธ์š”.

  • ํƒ€์ž… ๊ฐ€๋“œ(typeof, instanceof, in ๋˜๋Š” ์‚ฌ์šฉ์ž ์ •์˜ is ํ•จ์ˆ˜)๋กœ ํƒ€์ž…์„ ์•ˆ์ „ํ•˜๊ฒŒ ์ขํž ์ˆ˜ ์—†๋Š”๊ฐ€?
  • satisfies ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด ํƒ€์ž… ๊ฒ€์‚ฌ์™€ ํƒ€์ž… ์ถ”๋ก ์„ ๋ชจ๋‘ ๋งŒ์กฑ์‹œํ‚ฌ ์ˆ˜๋Š” ์—†๋Š”๊ฐ€?
  • ์ œ๋„ค๋ฆญ(Generic)์„ ์‚ฌ์šฉํ•ด ๋” ์œ ์—ฐํ•œ ํƒ€์ž… ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜๋Š” ์—†๋Š”๊ฐ€?

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

ํƒ€์ž… ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉ ํ•˜๋Š”๋ฐ์— ๋‘ ๊ฐ€์ง€ ๋ช…์–ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. any๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ง ๊ฒƒ.
  2. ํƒ€์ž… ๋‹จ์–ธ์„ ์‚ฌ์šฉํ•˜์ง€ ๋ง๊ฒƒ.

๊ทธ๋ ‡์ง€๋งŒ ์ •๋ง ํ™•์‹คํ•  ๋•Œ์— ํƒ€์ž… ๋‹จ์–ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ฝ”๋“œ ์ž‘์„ฑ์„ ํ›จ์”ฌ ๋น ๋ฅด๊ฒŒ ๋‹จ์ถ•์‹œํ‚ฌ ์ˆ˜ ์žˆ์ฃ  !

References

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํ˜•๋ณ€ํ™˜์˜ ๋ชจ๋“  ๊ฒƒ: ์™„๋ฒฝ ์ •๋ณต ๊ฐ€์ด๋“œ