Skip to content

πŸ’Ÿ [2μž₯] λ§΅λ“œ νƒ€μž…μ΄ 뭘까?

hyeyoonS edited this page May 23, 2024 · 1 revision
const metaData: MetadataProps = {
	author: "규호",
	createdAt: 2024-03-24,
	chapter: 2,
	description: "λ§΅λ“œ νƒ€μž…μ΄ 뭘까?"
	}
	
const { chapter, description } = metaData;

πŸ€”λ§΅λ“œ νƒ€μž…μ΄λž€?

λ§΅λ“œ νƒ€μž…(Mapped Types)은 TypeScript의 κ°•λ ₯ν•œ κΈ°λŠ₯ 쀑 ν•˜λ‚˜λ‘œ, κΈ°μ‘΄ νƒ€μž…μ„ λ³€ν™˜ν•˜μ—¬ μƒˆλ‘œμš΄ νƒ€μž…μ„ λ§Œλ“œλŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€. 이λ₯Ό 톡해 κΈ°μ‘΄ νƒ€μž…μ—μ„œ 속성을 ν•˜λ‚˜μ”© 가져와 μˆ˜μ •ν•˜κ±°λ‚˜ μƒˆλ‘œμš΄ 속성을 μΆ”κ°€ν•˜μ—¬ νƒ€μž…μ„ μœ μ—°ν•˜κ²Œ μ‘°μž‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ§΅λ“œ νƒ€μž…μ€ κΈ°μ‘΄ νƒ€μž…μ˜ 각 속성을 μˆœνšŒν•˜λ©΄μ„œ λ³€ν™˜ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” ν‚€μ›Œλ“œμž…λ‹ˆλ‹€. λ‹€μŒμ€ κ°€μž₯ 기본적인 ν˜•νƒœμ˜ λ§΅λ“œ νƒ€μž…μž…λ‹ˆλ‹€.

type MyMappedType = {
    [Property in OldType]: NewType;
};

μ—¬κΈ°μ„œ OldType은 κΈ°μ‘΄ νƒ€μž…μ„ λ‚˜νƒ€λ‚΄κ³ , NewType은 ν•΄λ‹Ή μ†μ„±μ˜ μƒˆλ‘œμš΄ νƒ€μž…μ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€. Property은 κΈ°μ‘΄ νƒ€μž…μ˜ 각 속성을 λ‚˜νƒ€λ‚΄λ©°, 이λ₯Ό 톡해 λ§΅λ“œ νƒ€μž…μ΄ ν•΄λ‹Ή 속성을 μˆœνšŒν•˜κ³  λ³€ν™˜ν•©λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, λ‹€μŒκ³Ό 같이 μΈν„°νŽ˜μ΄μŠ€ Person이 μžˆλ‹€κ³  κ°€μ •ν•΄λ΄…μ‹œλ‹€.

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

이제 λ§΅λ“œ νƒ€μž…μ„ μ‚¬μš©ν•˜μ—¬ Person μΈν„°νŽ˜μ΄μŠ€μ˜ 속성을 λ³€κ²½ν•˜μ—¬ μƒˆλ‘œμš΄ νƒ€μž…μ„ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

type ModifiedPerson = {
    [Property in keyof Person]: string;
};

μœ„ μ½”λ“œμ—μ„œ [Property in keyof Person] 뢀뢄은 Person μΈν„°νŽ˜μ΄μŠ€μ˜ 각 속성을 μˆœνšŒν•˜λŠ” λΆ€λΆ„μž…λ‹ˆλ‹€. 그리고 string은 각 μ†μ„±μ˜ μƒˆλ‘œμš΄ νƒ€μž…μ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν•˜λ©΄ ModifiedPerson νƒ€μž…μ€ Person μΈν„°νŽ˜μ΄μŠ€μ™€ λ™μΌν•œ 속성을 κ°€μ§€μ§€λ§Œ, λͺ¨λ“  μ†μ„±μ˜ νƒ€μž…μ΄ λ¬Έμžμ—΄λ‘œ λ³€κ²½λ©λ‹ˆλ‹€.

πŸ€λ§΅λ“œ νƒ€μž…μ˜ ν™œμš©

  • 선택적 속성을 가진 νƒ€μž…μ„ λ§Œλ“€κΈ°
  • 읽기 μ „μš© 속성을 μΆ”κ°€ν•˜κΈ°

β†’ λ§΅λ“œ νƒ€μž…μ€ TypeScriptμ—μ„œ νƒ€μž…μ„ μœ μ—°ν•˜κ²Œ 닀루고 μ‘°μž‘ν•˜λŠ” κ°•λ ₯ν•œ λ„κ΅¬λ‘œ ν™œμš©λ©λ‹ˆλ‹€.

1. 선택적 속성을 가진 νƒ€μž…μ„ λ§Œλ“€κΈ°

λ§΅λ“œ νƒ€μž…μ„ μ‚¬μš©ν•˜μ—¬ λͺ¨λ“  속성을 μ„ νƒμ μœΌλ‘œ λ§Œλ“œλŠ” μ˜ˆμ‹œ μ½”λ“œμž…λ‹ˆλ‹€.

type Partial<T> = {
    [K in keyof T]?: T[K]; // κΈ°μ‘΄ νƒ€μž… T의 λͺ¨λ“  속성을 μ„ νƒμ μœΌλ‘œ λ§Œλ“¦
};

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

type PartialUser = Partial<User>;

const partialUser: PartialUser = {}; // λͺ¨λ“  속성이 μ„ νƒμ μœΌλ‘œ λ§Œλ“€μ–΄μ§„ User νƒ€μž…
partialUser.name = 'John'; // μ„ νƒμ μœΌλ‘œ λ§Œλ“€μ–΄μ§„ μ†μ„±μ΄λ―€λ‘œ μ‚¬μš© κ°€λŠ₯
partialUser.age = 30; // μ„ νƒμ μœΌλ‘œ λ§Œλ“€μ–΄μ§„ μ†μ„±μ΄λ―€λ‘œ μ‚¬μš© κ°€λŠ₯

μœ„ μ˜ˆμ‹œ μ½”λ“œμ—μ„œλŠ” PartialλΌλŠ” λ§΅λ“œ νƒ€μž…μ„ μ •μ˜ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 이 λ§΅λ“œ νƒ€μž…μ€ μž…λ ₯된 μ œλ„€λ¦­ νƒ€μž… T의 λͺ¨λ“  속성을 μ„ νƒμ μœΌλ‘œ λ§Œλ“œλŠ” 역할을 ν•©λ‹ˆλ‹€. 이후 UserλΌλŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ •μ˜ν•˜κ³ , PartialUserλΌλŠ” μƒˆλ‘œμš΄ νƒ€μž…μ„ Partialλ₯Ό 톡해 μƒμ„±ν•©λ‹ˆλ‹€. 이둜써 PartialUser νƒ€μž…μ€ User νƒ€μž…μ˜ λͺ¨λ“  속성을 μ„ νƒμ μœΌλ‘œ κ°€μ§€κ²Œ λ©λ‹ˆλ‹€.





### 2. 읽기 μ „μš© 속성을 μΆ”κ°€ν•˜κΈ° λ§΅λ“œ νƒ€μž…μ„ μ‚¬μš©ν•˜μ—¬ 읽기 μ „μš© 속성을 μΆ”κ°€ν•˜λŠ” μ˜ˆμ‹œλ₯Ό μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€. TypeScriptμ—μ„œλŠ” readonly ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 속성을 읽기 μ „μš©μœΌλ‘œ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€. λ§΅λ“œ νƒ€μž…μ„ μ‚¬μš©ν•˜μ—¬ κΈ°μ‘΄ νƒ€μž…μ˜ λͺ¨λ“  속성을 읽기 μ „μš©μœΌλ‘œ λ§Œλ“€μ–΄λ³΄κ² μŠ΅λ‹ˆλ‹€.
type Readonly<T> = {
    readonly [K in keyof T]: T[K]; // κΈ°μ‘΄ νƒ€μž… T의 λͺ¨λ“  속성을 읽기 μ „μš©μœΌλ‘œ λ§Œλ“¦
};

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

type ReadonlyUser = Readonly<User>;

const readonlyUser: ReadonlyUser = { name: 'John', age: 30 };

// μ•„λž˜ μ½”λ“œλŠ” μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚΅λ‹ˆλ‹€.
readonlyUser.name = 'Doe'; // 속성이 읽기 μ „μš©μ΄λ―€λ‘œ λ³€κ²½ν•  수 μ—†μŒ
readonlyUser.age = 31; // 속성이 읽기 μ „μš©μ΄λ―€λ‘œ λ³€κ²½ν•  수 μ—†μŒ

μœ„ μ½”λ“œμ—μ„œλŠ” ReadonlyλΌλŠ” λ§΅λ“œ νƒ€μž…μ„ μ •μ˜ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 이 λ§΅λ“œ νƒ€μž…μ€ μž…λ ₯된 μ œλ„€λ¦­ νƒ€μž… T의 λͺ¨λ“  속성을 읽기 μ „μš©μœΌλ‘œ λ§Œλ“œλŠ” 역할을 ν•©λ‹ˆλ‹€. 그리고 UserλΌλŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ •μ˜ν•˜κ³ , ReadonlyUserλΌλŠ” μƒˆλ‘œμš΄ νƒ€μž…μ„ Readonlyλ₯Ό 톡해 μƒμ„±ν•©λ‹ˆλ‹€. μ΄λ ‡κ²Œ μƒμ„±λœ ReadonlyUser νƒ€μž…μ€ User νƒ€μž…μ˜ λͺ¨λ“  속성을 읽기 μ „μš©μœΌλ‘œ κ°€μ§€κ²Œ λ©λ‹ˆλ‹€.

이후에 readonlyUser 객체λ₯Ό μƒμ„±ν•˜κ³ , 이 객체의 속성을 λ³€κ²½ν•˜λ €κ³  μ‹œλ„ν•˜λŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ 속성이 읽기 μ „μš©μœΌλ‘œ λ§Œλ“€μ–΄μ‘ŒκΈ° λ•Œλ¬Έμ— ν•΄λ‹Ή 속성을 λ³€κ²½ν•  수 μ—†μœΌλ©°, μ»΄νŒŒμΌλŸ¬κ°€ 이λ₯Ό κ°μ§€ν•˜μ—¬ μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚΅λ‹ˆλ‹€.

Clone this wiki locally