๐Ÿ“– TIL - TypeScript ๋ฉด์ ‘ ๋Œ€๋น„ ํ•ต์‹ฌ ์ •๋ฆฌ

์Š˜ยท2025๋…„ 7์›” 12์ผ

๐Ÿ“– TIL

๋ชฉ๋ก ๋ณด๊ธฐ
83/90

ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๋กœ ์ทจ์—…์„ ์ค€๋น„ํ•˜๋ฉด์„œ TypeScript์— ๋Œ€ํ•œ ์ดํ•ด๋ฅผ ์ •๋ฆฌํ•˜๊ณ ์ž, ์‹ค์ œ ๋ฉด์ ‘์—์„œ ์ž์ฃผ ๋‚˜์˜ค๋Š” TypeScript ํ•ต์‹ฌ ๊ฐœ๋…๋“ค์„ ์ •๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


๐Ÿ”€ Union vs Intersection ํƒ€์ž…

Union ํƒ€์ž…(|)์€ ์—ฌ๋Ÿฌ ํƒ€์ž… ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
์ฆ‰, ๋˜๋Š”(OR)์˜ ๊ฐœ๋…์œผ๋กœ ํƒ€์ž… ๊ฐ€๋Šฅ์„ฑ์„ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค.
Intersection ํƒ€์ž…(&)์€ ์—ฌ๋Ÿฌ ํƒ€์ž…์„ ๋ชจ๋‘ ๋งŒ์กฑํ•˜๋Š” ํƒ€์ž…์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๊ทธ๋ฆฌ๊ณ (AND)์˜ ๊ฐœ๋…์œผ๋กœ ํƒ€์ž… ๊ฐ€๋Šฅ์„ฑ์œผ ์ถ•์†Œํ•ฉ๋‹ˆ๋‹ค.

type A = { a: string }
type X = { x: number }

// Union: A ๋˜๋Š” X ํƒ€์ž… (ํ™•์žฅ)
type AorX = A | X
const a: AorX = { a: 'hello' }  // A ํƒ€์ž…๋งŒ ๋งŒ์กฑ
const b: AorX = { x: 12 }       // X ํƒ€์ž…๋งŒ ๋งŒ์กฑ

// Intersection: A ๊ทธ๋ฆฌ๊ณ  X ํƒ€์ž…์„ ๋ชจ๋‘ ๋งŒ์กฑ (์ถ•์†Œ)
type AandX = A & X
const c: AandX = { a: 'hi', x: 12 }  // A์™€ X ๋ชจ๋‘ ๋งŒ์กฑํ•ด์•ผ ํ•จ

๐Ÿ’ก ํฌ์ธํŠธ: ์ถ•์†Œ/ํ™•์žฅ์€ ์ข‹๊ณ  ๋‚˜์จ์˜ ๊ฐœ๋…์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ƒํ™ฉ์— ๋งž๊ฒŒ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ”ง Interface vs Type Alias

Interface

  • ์ฃผ๋กœ ๊ฐ์ฒด ํƒ€์ž… ์ •์˜์— ์‚ฌ์šฉ
  • ์„ ์–ธ ๋ณ‘ํ•ฉ(Declaration Merging) ์ง€์›
  • extendsํ‚ค์›Œ๋“œ๋กœ ํ™•์žฅ ๊ฐ€๋Šฅ
  • ํ™•์žฅ์„ฑ์ด ์ค‘์š”ํ•œ ๊ฒฝ์šฐ ์ ํ•ฉ

Type Alias

  • ๊ฐ์ฒด๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์œ ๋‹ˆ์–ธ, ์ธํ„ฐ์„น์…˜, ์ œ๋„ค๋ฆญ ๋“ฑ ๋‹ค์–‘ํ•œ ํƒ€์ž… ์ •์˜ ๊ฐ€๋Šฅ
  • ์„ ์—… ๋ณ‘ํ•ฉ ๋ถˆ๊ฐ€
  • ์ •์ ์ด์ง€๋งŒ ์ƒˆ๋กœ์šด ํƒ€์ž… ์ •์˜์— ์ ํ•ฉ
// Interface - ์„ ์–ธ ๋ณ‘ํ•ฉ ๊ฐ€๋Šฅ
interface User {
  name: string
}
interface User {
  age: number
}
// ์ž๋™์œผ๋กœ ๋ณ‘ํ•ฉ๋จ: { name: string, age: number }

// Interface - ํ™•์žฅ
interface Admin extends User {
  role: string
}

// Type Alias - ๋‹ค์–‘ํ•œ ํƒ€์ž… ์ •์˜
type Status = 'loading' | 'success' | 'error'

// Interface์˜ extends์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉ๊ฐ€๋Šฅํ•จ
type UserWithStatus = User & { status: Status }

๐Ÿ›ก๏ธ Type Guard

๋Ÿฐํƒ€์ž„์—์„œ ๋ณ€์ˆ˜์˜ ํƒ€์ž…์„ ๊ฒ€์‚ฌํ•˜๊ณ , ํ•ด๋‹น ํƒ€์ž…์— ๋”ฐ๋ผ ์•ˆ์ „ํ•œ ์ฝ”๋“œ ๋ธ”๋ก์„ ๋งŒ๋“œ๋Š” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค.

์ฃผ์š” ๋ฐฉ๋ฒ•๋“ค

  • typeof ์—ฐ์‚ฐ์ž
  • instanceof ์—ฐ์‚ฐ์ž
  • in ์—ฐ์‚ฐ์ž
  • is ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ํƒ€์ž… ๊ฐ€๋“œ
const el = document.querySelect('button')

// ๋ฌธ์ œ ๋ฐœ์ƒ ์ฝ”๋“œ
// button์ด๋ผ๋Š” ๋…ธ๋“œ๋ฅผ ์ฐพ์ง€ ๋ชปํ•˜๋ฉด Null์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋จ
// ์•„๋ž˜ ๋ถ€๋ถ„์—์„œ Error๊ฐ€ ๋ฐœ์ƒํ•  ์šฐ๋ ค๊ฐ€ ์ƒ๊ธฐ๊ฒŒ ๋œ๋‹ค.
el.addEventListner();

์˜ต์…”๋„ ์ฒด์ด๋‹์„ ์‚ฌ์šฉํ•˜์—ฌ el?.addEventListner()์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๋งค๋ฒˆ el์„ ์‚ฌ์šฉํ•  ๋•Œ ์˜ต์…”๋„ ์ฒด์ด๋‹์„ ๋ถ™์—ฌ์ค˜์•ผํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์กด์žฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ์—ฌ๋Ÿฌ ํƒ€์ž… ๊ฐ€๋“œ ๋ฐฉ๋ฒ•๋“ค์„ ์‚ฌ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// 1. ๊ธฐ๋ณธ ํƒ€์ž…
if(el){
	el.addEventListner('click', () => {})
}

// 2. instanceof ์‚ฌ์šฉ
if(el instanceof HTMLButtonElement){
	el.click();
}

// 3. in ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ
if(el && 'classList' in el){
	el.classList.add('active');
}

// 4. ์‚ฌ์šฉ์ž ์ •์˜ ํƒ€์ž… ๊ฐ€๋“œ
// is : ์ด ํ•จ์ˆ˜๊ฐ€ true๋ฅผ ๋ฐ˜ํ™˜ํ•  ๊ฒฝ์šฐ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธํ•œํ…Œ ์ด ํƒ€์ž…์ด๋ผ๊ณ  ๋ด๋„ ๋จ ์ด๋ผ๊ณ  ํ™•์‹ ์„ ์ฃผ๊ฒŒ ๋งŒ๋“œ๋Š”๊ฒƒ.
function isHTMLElement(el: Element | null): el is HTMLElement{
	return el instanceof HTMLElemnt
}

if(isHTMLElement(el)){
  el.style.color = 'red'
}

โšก Type Assertion

๊ฐœ๋ฐœ์ž๊ฐ€ TypeScript๋ณด๋‹ค ํƒ€์ž…์„ ๋” ์ •ํ™•ํžˆ ์•Œ๊ณ  ์žˆ์„ ๋•Œ, ๋ช…์‹œ์ ์œผ๋กœ ํƒ€์ž…์„ ๊ฐ•์ œํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

์‚ฌ์šฉ ๋ฐฉ๋ฒ•

  • asํ‚ค์›Œ๋“œ ์‚ฌ์šฉ
  • ! Non-null ๋‹จ์–ธ ์—ฐ์‚ฐ์ž
  • satisfies ํ‚ค์›Œ๋“œ๋กœ ํƒ€์ž… ์•ˆ์ •์„ฑ ํ™•๋ณด
const body = document.querySelector('body');
// body๋Š” ํ•ญ์ƒ ์กด์žฌํ•˜๋ฏ€๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ๋‹จ์–ธ ๊ฐ€๋Šฅ
(body as HTMLElemnt).classList.add('on');

// Non-null(!) ๋‹จ์–ธ ์—ฐ์‚ฐ์ž
// ๋ณ€์ˆ˜๊ฐ€ 'null'์ด๋‚˜ 'undefined'๊ฐ€ ์•„๋‹˜์„ ๋‹จ์–ธํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
body!.classList.add('on');

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

๊ฐœ๋ฐœ์ž์˜ ์‹œ์„ ์—์„œ ์ด ํƒ€์ž…์„ ๋‹จ์–ธํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ณ  ์ž˜๋ชป๋œ ํƒ€์ž…์œผ๋กœ ๋„˜์–ด์˜ฌ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹ ์ค‘ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด์„œ..

interface X{
	x: string
  	y: number
}
const a = {
	b:{
    	x: 'hi'
    } as X
}

ํ•ด๋‹น ์ฝ”๋“œ๋Š” y๊ฐ€ ์—†๋Š”๋ฐ๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์—๋Ÿฌํ‘œ์‹œ๋ฅผ ํ•˜๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์™œ๋ƒ๋ฉด ํƒ€์ž… ๋‹จ์–ธ์„ ํ•˜์˜€๊ธฐ์— ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด์ฃ 
์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ ์ž satisfies ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
satisfies๋Š” ํƒ€์ž…์„ ๋งŒ์กฑํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ํ‚ค์›Œ๋“œ์ž…๋‹ˆ๋‹ค.

// satisfies๋กœ ์•ˆ์ •์„ฑ ํ™•๋ณด
interface Config{
  apiUrl: string
  timeout: number
}

const config = {
  apiUrl: 'https://api.example.com',
  timeout: 5000
} satisfies Config as Config

๐Ÿ“ Record Utility Type

ํ‚ค์™€ ๊ฐ’์˜ ํƒ€์ž…์„ ์ง€์ •ํ•ด ๊ฐ์ฒด ํƒ€์ž…์„ ์ •์˜ํ•˜๋Š” TypeScript ๋‚ด์žฅ ์œ ํ‹ธ๋ฆฌํ‹ฐ์ž…๋‹ˆ๋‹ค.

์–ธ์ œ ์‚ฌ์šฉํ• ๊นŒ?

  • ์†์„ฑ ์ด๋ฆ„์ด ๋™์ ์œผ๋กœ ๊ฒฐ์ •๋˜๋Š” ๊ฒฝ์šฐ
  • ๋ชจ๋“  ์†์„ฑ์ด ๊ฐ™์€ ํƒ€์ž…์˜ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ๊ฒฝ์šฐ
  • ๋Œ€๊ด„ํšจ ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ๋™์  ์ ‘๊ทผ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ
interface A {
	a:number
  	b:number
  	c:number
   	// ...
}
const a:A = {
	a:1,
  	b:2,
  	c:3,
  	// ... 
}

๋งŒ์•ฝ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฐ์ฒด ํƒ€์ž…๋“ค์ด ๋ชจ๋‘ ๋™์ผํ•œ ๊ฒฝ์šฐ ์ผ์ผํžˆ ๊ฐ™์€ ํƒ€์ž…๋“ค์„ ํ•˜๋‚˜ํ•˜๋‚˜ ๋‹ค ๋ช…์‹œ๋ฅผ ํ•ด์ค˜์•ผ ํ•˜๋Š” ๋ถˆํŽธํ•จ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

let p = 'a'
a[p] // Error!

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

interface A{
	[key:string] : number
  	// ...
}
a[p] = 9; // ๊ฐ’ ํ• ๋‹น๋„ ๊ฐ€๋Šฅํ•จ

๊ทธ๋ฆฌ๊ณ  record ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

const a = Record<string, number> = {...}

๋™์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ๊ฐ€ ์‰ฝ์ง€๋งŒ, ์†์„ฑ์ด ์•„์ฃผ ๋งŽ๊ฑฐ๋‚˜ ์ •ํ™•ํ•˜๊ฒŒ ์–ด๋– ํ•œ ์†์„ฑ์ด ๋“ค์–ด๊ฐ€์•ผ ๋œ๋‹ค๊ณ  ํ•œ๋‹ค๋ฉด Record์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š๊ณ  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ ํ•ฉํ•˜๋‹ค.


๐ŸŽฏ ๋ฉด์ ‘ ์งˆ์˜์‘๋‹ต ๋Œ€๋น„

Q1) TypeScript ์œ ๋‹ˆ์–ธ๊ณผ ์ธํ„ฐ์„น์…˜ ํƒ€์ž…์˜ ์ฐจ์ด์ ์„ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”

A) ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ ์œ ๋‹ˆ์–ธ ํƒ€์ž…์€ '|(vertical bar)'๊ธฐํ˜ธ๋ฅผ ํ†ตํ•ด์„œ ์—ฌ๋Ÿฌ ํƒ€์ž… ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ •์˜ํ•˜๋ฉฐ, ๋˜๋Š”(or)๊ณผ ๋น„์Šทํ•œ ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ ์ธํ„ฐ์„น์…˜ ํƒ€์ž…์€ '&(Intersection)'๊ธฐํ˜ธ๋กœ ์—ฌ๋Ÿฌ ํƒ€์ž…์„ ๋ชจ๋‘ ๋งŒ์กฑํ•˜๋Š” ํƒ€์ž…์„ ์ •์˜ํ•˜๋ฉฐ, ๊ทธ๋ฆฌ๊ณ (and)์™€ ๋น„์Šทํ•œ ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ์œ ๋‹ˆ์–ธ ํƒ€์ž… ๊ฐ€๋Šฅ์„ฑ์„ ํ™•์žฅํ•˜๊ณ  ์ธํ„ฐ์„น์…˜ ํƒ€์ž…์€ ํƒ€์ž… ๊ฐ€๋Šฅ์„ฑ์„ ์ถ•์†Œํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Q2) ์ธํ„ฐํŽ˜์ด์Šค์™€ ํƒ€์ž… ๋ณ„์นญ์˜ ์ฐจ์ด์ ์„ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

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

Q3) TypeScript ํƒ€์ž… ๊ฐ€๋“œ(Type Guard)์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”.

A) ํƒ€์ž… ๊ฐ€๋“œ๋Š” ๋Ÿฐํƒ€์ž„์—์„œ ๋ณ€์ˆ˜์˜ ํƒ€์ž…์„ ๊ฒ€์‚ฌํ•˜๊ณ , ํ•ด๋‹น ํƒ€์ž…์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ์ฃผ๋กœ typeof, instanceof, in ์—ฐ์‚ฐ์ž๋กœ ์ง์ ‘ ๋ฐ์ดํ„ฐ์˜ ํƒ€์ž…์„ ๊ฒ€์‚ฌํ•˜๊ฑฐ๋‚˜, is ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ณ„๋„์˜ ํƒ€์ž… ๊ฐ€๋“œ ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

Q4) TypeScript ํƒ€์ž… ๋‹จ์–ธ(Assertion)์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”.

A) ํƒ€์ž… ๋‹จ์–ธ์€ ์ •ํ™•ํ•œ ํƒ€์ž… ์ถ”๋ก ์ด ์–ด๋ ค์šด ๊ฒฝ์šฐ, ํŠน์ • ๊ฐ’์˜ ํƒ€์ž…์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ๊ฐ•์ œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ์ฃผ๋กœ asํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ํƒ€์ž…์„ ๋‹จ์–ธํ•˜๊ณ  !(Non-null)๋‹จ์–ธ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด ๋ณ€์ˆ˜๊ฐ€ null์ด๋‚˜ undefined๊ฐ€ ์•„๋‹˜์„ ๋‹จ์–ธํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ํƒ€์ž…์„ ๊ฐ•์ œํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—, ํƒ€์ž… ์•ˆ์ •์„ฑ์„ ํ•ด์น  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์‹ ์ค‘ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํƒ€์ž… ๋‹จ์–ธ ๋Œ€์‹  ํƒ€์ž… ๊ฐ€๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ satisfiesํ‚ค์›Œ๋“œ์˜ ํƒ€์ž… ๋งŒ์กฑ์„ ๊ฐ™์ด ์‚ฌ์šฉํ•ด ํƒ€์ž… ์•ˆ์ •์„ฑ์„ ํ™•๋ณดํ•˜๋Š” ์ ‘๊ทผ ๋ฐฉ๋ฒ•๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

Q5) TypeScript Record ์œ ํ‹ธ๋ฆฌํ‹ฐ ํƒ€์ž…์˜ ๊ธฐ๋Šฅ๊ณผ ๋Œ€ํ‘œ์ ์ธ ์‚ฌ์šฉ๋ฒ•์„ ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”.

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


๐Ÿš€ ๋งˆ๋ฌด๋ฆฌ

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

์‹ค์ œ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•ด๋ณด๋ฉฐ ์ด๋Ÿฐ ๊ฐœ๋…๋“ค์„ ํ™œ์šฉํ•ด๋ณด๋ฉด์„œ ๊ฒฝํ—˜์„ ์Œ“์•„๋ณด์„ธ์š”

profile
์ฃผ๋‹ˆ์–ด ํ”„๋ก ํŠธ์—”๋“œ ์„ฑ์žฅ๊ธฐ ๊ธฐ๋ก๊ธฐ๋ก

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