πŸ“˜ νƒ€μž…μŠ€ν¬λ¦½νŠΈ κ°œλ… 정리12

seoyoon_leeΒ·2026λ…„ 3μ›” 31일

TypeScript

λͺ©λ‘ 보기
19/21
post-thumbnail

🌱 νƒ€μž…μŠ€ν¬λ¦½νŠΈ νƒ€μž… μ‘°μž‘ 정리

1️⃣ 인덱슀 μ•‘μ„ΈμŠ€ νƒ€μž… (Index Access Type)

πŸ‘‰ 핡심 κ°œλ…

β€œκ°μ²΄ νƒ€μž…μ—μ„œ νŠΉμ • κ°’ νƒ€μž…λ§Œ 꺼내쓰기”

πŸ“Œ μ˜ˆμ‹œ (μ‰½κ²Œ λ°”κΏ”μ„œ μ„€λͺ…)

interface User {
  name: string;
  age: number;
  address: {
    city: string;
    zip: number;
  };
}

βœ… νŠΉμ • νƒ€μž… κΊΌλ‚΄κΈ°

type UserName = User['name']; // string
type UserAddress = User['address']; // { city: string; zip: number }
type UserCity = User['address']['city']; // string

πŸ‘‰ 해석

  • User['name'] β†’ name νƒ€μž… 꺼냄
  • User['address'] β†’ address 객체 ν†΅μ§Έλ‘œ
  • User['address']['city'] β†’ city만 꺼냄

βœ… ν•¨μˆ˜μ—μ„œ ν™œμš©

function printUser(user: User['address']) {
  console.log(user.city);
}

πŸ‘‰ 의미

  • β€œUser νƒ€μž… μ•ˆμ— μžˆλŠ” address ꡬ쑰 κ·ΈλŒ€λ‘œ 받겠닀”

⚠️ μ‹€μˆ˜ 포인트

❌ 잘λͺ»λœ 생각

User[name] // ❌ (λ¬Έμžμ—΄ μ•„λ‹˜)

βœ… μ˜¬λ°”λ₯Έ 방법

User['name'] // ⭕️ λ¬Έμžμ—΄λ‘œ 써야 함

2️⃣ λ°°μ—΄μ—μ„œ νƒ€μž… κΊΌλ‚΄κΈ°

πŸ‘‰ 핡심

λ°°μ—΄ μ•ˆ "μš”μ†Œ ν•˜λ‚˜μ˜ νƒ€μž…" κΊΌλ‚΄κΈ°

πŸ“Œ μ˜ˆμ‹œ

type ProductList = {
  name: string;
  price: number;
}[];

βœ… μš”μ†Œ νƒ€μž… κΊΌλ‚΄κΈ°

type Product = ProductList[number];

πŸ‘‰ 해석

β€œλ°°μ—΄ μ•ˆμ— μžˆλŠ” μš”μ†Œ νƒ€μž… ν•˜λ‚˜

βœ… ν™œμš©

function printProduct(product: ProductList[number]) {
  console.log(product.name);
}

3️⃣ νŠœν”Œ νƒ€μž…

type MyTuple = [number, string, boolean];

βœ… νŠΉμ • μš”μ†Œ νƒ€μž…

type A = MyTuple[0]; // number
type B = MyTuple[1]; // string

βœ… 전체 νƒ€μž… μœ λ‹ˆμ˜¨

type All = MyTuple[number]; 
// number | string | boolean

πŸ‘‰ 의미

β€œνŠœν”Œ μ•ˆμ— λ“€μ–΄μžˆλŠ” λͺ¨λ“  νƒ€μž… ν•©μΉ˜κΈ°β€

4️⃣ keyof μ—°μ‚°μž

πŸ‘‰ 핡심

β€œκ°μ²΄μ˜ key만 λ½‘μ•„μ„œ νƒ€μž…μœΌλ‘œ λ§Œλ“€κΈ°β€

πŸ“Œ μ˜ˆμ‹œ

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

βœ… key μΆ”μΆœ

type Keys = keyof Person;
// "name" | "age"

βœ… ν•¨μˆ˜ ν™œμš© (μ€‘μš”πŸ”₯)

function getValue(obj: Person, key: keyof Person) {
  return obj[key];
}

πŸ‘‰ 의미

  • keyλŠ” "name" λ˜λŠ” "age"만 κ°€λŠ₯
  • μ•ˆμ „ν•˜κ²Œ μ ‘κ·Ό κ°€λŠ₯

⚠️ μ‹€μˆ˜ 포인트

❌

keyof person // ❌ (κ°’μ΄λΌμ„œ μ•ˆλ¨)

βœ…

keyof Person // ⭕️ νƒ€μž…λ§Œ κ°€λŠ₯
πŸ’‘ typeof와 같이 μ“°κΈ°
const person = {
  name: 'λ―Όμ§€',
  age: 20,
};

type PersonType = typeof person;

function getValue(obj: PersonType, key: keyof typeof person) {
  return obj[key];
}

5️⃣ Mapped νƒ€μž… (πŸ”₯싀무 핡심πŸ”₯)

πŸ‘‰ 핡심

β€œκΈ°μ‘΄ νƒ€μž…μ„ 기반으둜 μƒˆλ‘œμš΄ νƒ€μž… λ§Œλ“€κΈ°β€

πŸ“Œ μ˜ˆμ‹œ

interface User {
  id: number;
  name: string;
  age: number;
}

βœ… λͺ¨λ“  값을 boolean으둜 λ°”κΎΈκΈ°

type BooleanUser = {
  [key in keyof User]: boolean;
};

πŸ‘‰ κ²°κ³Ό

{
  id: boolean;
  name: boolean;
  age: boolean;
}

βœ… readonly λ§Œλ“€κΈ°

type ReadonlyUser = {
  readonly [key in keyof User]: User[key];
};

πŸ‘‰ μˆ˜μ • λΆˆκ°€λŠ₯

πŸ’‘ μ‹€μ œ μ‚¬μš© 이유

function fetchUser(): ReadonlyUser {
  return {
    id: 1,
    name: 'λ―Όμ§€',
    age: 20,
  };
}

πŸ‘‰ 데이터λ₯Ό λ³΄ν˜Έν•˜κΈ° μœ„ν•΄ μ‚¬μš©

βœ… μΌλΆ€λ§Œ μˆ˜μ • κ°€λŠ₯ν•˜κ²Œ λ§Œλ“€κΈ°

(μ‹€λ¬΄μ—μ„œ 많이 씀πŸ”₯)

type PartialUser = {
  [key in keyof User]?: User[key];
};

πŸ‘‰ κ²°κ³Ό


{
  id?: number;
  name?: string;
  age?: number;
}

6️⃣ ν…œν”Œλ¦Ώ λ¦¬ν„°λŸ΄ νƒ€μž…

πŸ‘‰ 핡심

β€œλ¬Έμžμ—΄ νŒ¨ν„΄ λ§Œλ“€κΈ°β€

πŸ“Œ μ˜ˆμ‹œ

type Fruit = 'apple' | 'banana';
type Color = 'red' | 'yellow';

βœ… μ‘°ν•© λ§Œλ“€κΈ°

type FruitColor = `${Color}-${Fruit}`;

πŸ‘‰ κ²°κ³Ό

"red-apple"
"red-banana"
"yellow-apple"
"yellow-banana"

πŸ’₯ 핡심 μš”μ•½
| κ°œλ… | ν•œμ€„ μš”μ•½ |
| ---------- | ----------- |
| 인덱슀 νƒ€μž… | κ°μ²΄μ—μ„œ νƒ€μž… κΊΌλ‚΄κΈ° |
| λ°°μ—΄[number] | μš”μ†Œ νƒ€μž… κΊΌλ‚΄κΈ° |
| keyof | key만 뽑기 |
| mapped | νƒ€μž… λ³€ν˜• |
| ν…œν”Œλ¦Ώ νƒ€μž… | λ¬Έμžμ—΄ μ‘°ν•© |

⚠️ 많이 ν•˜λŠ” μ‹€μˆ˜

  1. κ°’ vs νƒ€μž… ꡬ뢄 λͺ»ν•¨
  • ❌ keyof person
  • βœ… keyof typeof person
  1. μΈλ±μŠ€μ— λ”°μ˜΄ν‘œ μ•ˆμ”€
  • ❌ User[name]
  • βœ… User['name']
  1. λ°°μ—΄ νƒ€μž… 착각
  • ❌ ProductList[0] (νƒ€μž… μ•„λ‹˜)
  • βœ… ProductList[number]

🎯 ν•œμ€„ 정리

πŸ‘‰ νƒ€μž… μ‘°μž‘μ€
"이미 μžˆλŠ” νƒ€μž…μ„ κΊΌλ‚΄κ³ , λ°”κΎΈκ³ , μ‘°ν•©ν•˜λŠ” 기술"

profile
Frontend Developer · 기둝 ⭐

0개의 λŒ“κΈ€