Generic

μ œλ„ˆλ¦­μ„ μ΄μš©ν•΄ μ—¬λŸ¬ νƒ€μž…μ— λŒ€ν•΄ λ™μΌν•œ κ·œμΉ™μ„ κ°–κ³  λ™μž‘ν•˜λŠ” νƒ€μž…μ„ 손쉽고 μš°μ•„ν•˜κ²Œ μ •μ˜ν•  수 μžˆλ‹€.

동기뢀여

λ‹€μŒμ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ ν•¨μˆ˜λ₯Ό μƒκ°ν•΄λ³΄μž. 인자둜 λ„˜κ²¨μ§€λŠ” 배열은 항상 같은 νƒ€μž…μ˜ κ°’μœΌλ‘œ 이루어져 μžˆλ‹€κ³  κ°€μ •ν•œλ‹€.
function getFirstElem(arr) { if (!Array.isArray(arr)) { throw new Error('getFirstElemOrNull: Argument is not array!'); } if (arr.length === 0) { throw new Error('getFirstElemOrNull: Argument is an empty array!'); } return arr[0] ? arr[0] : null; }
배열을 λ°›μ•„ 첫 번째 μ›μ†Œκ°€ μžˆμ„ μ‹œ κ·Έ μ›μ†Œλ₯Ό λ¦¬ν„΄ν•˜λŠ” 맀우 κ°„λ‹¨ν•œ ν•¨μˆ˜λ‹€.
λ¬Έμžμ—΄μ˜ 배열을 인자둜 ν˜ΈμΆœν•˜λ©΄ λ¬Έμžμ—΄ νƒ€μž…μ˜ 값을, 숫자의 배열을 인자둜 ν˜ΈμΆœν•˜λ©΄ 숫자 νƒ€μž…μ˜ 값을 λ°˜ν™˜ν•  것이닀. 이 ν•¨μˆ˜μ˜ νƒ€μž…μ„ μ–΄λ–»κ²Œ μ •μ˜ν•  수 μžˆμ„κΉŒ?
λ§Œμ•½ getFirstElem이 λ¬Έμžμ—΄κ³Ό 숫자 두 νƒ€μž…λ§Œμ„ μ§€μ›ν•œλ‹€λ©΄ ν•¨μˆ˜ μ˜€λ²„λ‘œλ”©μ„ μ΄μš©ν•΄ λ‹€μŒκ³Ό 같이 μ“Έ 수 μžˆλ‹€.
function getFirstElem(arr: string[]): string; function getFirstElem(arr: number[]): number; function getFirstElem(arr) { if (!Array.isArray(arr)) { throw new Error('getFirstElemOrNull: Argument is not array!'); } if (arr.length === 0) { throw new Error('getFirstElemOrNull: Argument is an empty array!'); } return arr[0] ? arr[0] : null; }
ν•˜μ§€λ§Œ 이 ν•¨μˆ˜κ°€ μž„μ˜μ˜ νƒ€μž… 값을 μ›μ†Œλ‘œ κ°–λŠ” 배열에 λŒ€ν•΄ λ™μž‘ν•˜λ„λ‘ λ§Œλ“€λ €λ©΄ μ–΄λ–»κ²Œ ν•΄μ•Ό ν• κΉŒ?
μ‘΄μž¬ν•  수 μžˆλŠ” λͺ¨λ“  νƒ€μž…μ— λŒ€ν•΄ μ˜€λ²„λ‘œλ”©μ„ μ λŠ” 건 (κ°€λŠ₯ν•œ νƒ€μž…μ˜ μˆ˜κ°€ λ¬΄ν•œν•˜λ―€λ‘œ) λΆˆκ°€λŠ₯ν•˜λ‹€.
μΈμžμ™€ λ°˜ν™˜ νƒ€μž…μ„ any둜 μ •μ˜ν•œλ‹€λ©΄ λ™μž‘μ€ ν•˜κ² μ§€λ§Œ, νƒ€μž… 정보λ₯Ό λͺ¨λ‘ μžƒκ²Œ λ˜λ―€λ‘œ 쒋은 방법이 μ•„λ‹ˆλ‹€.
μš°λ¦¬κ°€ μ›ν•˜λŠ” κΈ°λŠ₯은 λ‹€μŒκ³Ό κ°™λ‹€. μ—¬λŸ¬ νƒ€μž…μ— λŒ€ν•΄ λ™μž‘ν•˜λŠ” ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜λ˜, ν•΄λ‹Ή ν•¨μˆ˜λ₯Ό μ •μ˜ν•  λ•ŒλŠ” μ•Œ 수 μ—†κ³  μ‚¬μš©ν•  λ•Œμ—λ§Œ μ•Œ 수 μžˆλŠ” νƒ€μž… 정보λ₯Ό μ‚¬μš©ν•˜κ³  μ‹Άλ‹€. μ œλ„ˆλ¦­μ€ λ°”λ‘œ κ·ΈλŸ¬ν•œ κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€.

νƒ€μž… λ³€μˆ˜

ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” μ‹œμ μ΄ λ˜μ–΄μ•Όλ§Œ μ•Œ 수 μžˆλŠ” 값을 ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” κ·Έ 값을 λ‹΄μ•„λ‘˜ λ§€κ°œλ³€μˆ˜κ°€ ν•„μš”ν•˜λ‹€.
λ§ˆμ°¬κ°€μ§€λ‘œ, μš”μ†Œλ₯Ό μ‚¬μš©ν•˜λŠ” μ‹œμ μ—μ„œλ§Œ μ•Œ 수 μžˆλŠ” νƒ€μž…μ„ 담아두기 μœ„ν•΄μ„œλŠ” νƒ€μž… λ³€μˆ˜(type variable)κ°€ ν•„μš”ν•˜λ‹€.
νƒ€μž… λ³€μˆ˜μ™€ νƒ€μž…μ˜ κ΄€κ³„λŠ” λ§€κ°œλ³€μˆ˜μ™€ 인자 κ°’μ˜ 관계와 λΉ„μŠ·ν•˜λ‹€.
notion image
νƒ€μž… λ³€μˆ˜λŠ” λΆ€λ“±ν˜Έ(<,>)둜 λ³€μˆ˜λͺ…을 감싸 μ •μ˜ν•œλ‹€.
μ΄λ ‡κ²Œ μ •μ˜ν•œ νƒ€μž… λ³€μˆ˜λ₯Ό μš”μ†Œμ˜ νƒ€μž… μ •μ˜ (예λ₯Ό λ“€μ–΄ ν•¨μˆ˜μ˜ 인자 및 λ°˜ν™˜ νƒ€μž…)에 μ‚¬μš©ν•  수 μžˆλ‹€.
λΆ€λ“±ν˜Έ 기호 μ•ˆμ— μ •μ˜λœ νƒ€μž… λ³€μˆ˜μ˜ μ‹€μ œ νƒ€μž…μ€ μ‹€μ œ 값이 λ„˜μ–΄μ˜€λŠ” μ‹œμ μ— κ²°μ •λœλ‹€.
μ»¨λ²€μ…˜ 상 νƒ€μž…μŠ€ν¬λ¦½νŠΈμ˜ νƒ€μž… λ³€μˆ˜λŠ” λŒ€λ¬Έμžλ‘œ μ‹œμž‘ν•˜λ©° PascalCase λͺ…λͺ…법을 μ‚¬μš©ν•œλ‹€.

μ œλ„ˆλ¦­ ν•¨μˆ˜

νƒ€μž… λ³€μˆ˜λ₯Ό μ΄μš©ν•΄ μœ„μ˜ getFirstElem ν•¨μˆ˜λ₯Ό λ‹€μŒκ³Ό 같이 μ œλ„ˆλ¦­ ν•¨μˆ˜λ‘œ μ •μ˜ν•  수 μžˆλ‹€.
function getFirstElem<T>(arr: T[]): T { /* ν•¨μˆ˜ λ³Έλ¬Έ */ }
μœ„μ˜ νƒ€μž… μ •μ˜λŠ” λ‹€μŒκ³Ό 같이 읽을 수 μžˆλ‹€.
μž„μ˜μ˜ νƒ€μž… T에 λŒ€ν•΄, getFirstElem은 T νƒ€μž… κ°’μ˜ λ°°μ—΄ arrλ₯Ό 인자둜 λ°›μ•„ T νƒ€μž… 값을 λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜λ‹€.
보닀 μΌλ°˜μ μœΌλ‘œλŠ” λ‹€μŒκ³Ό 같은 꼴이 λœλ‹€. 이 λ•Œ 인자 νƒ€μž…κ³Ό λ°˜ν™˜ νƒ€μž…μ„ ν‘œν˜„ν•  λ•Œ νƒ€μž… λ³€μˆ˜λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.
function ν•¨μˆ˜λͺ…<νƒ€μž… λ³€μˆ˜>(인자 νƒ€μž…): λ°˜ν™˜ νƒ€μž… { /* ν•¨μˆ˜ λ³Έλ¬Έ */ }
ν•¨μˆ˜λ₯Ό 호좜 ν•  λ•Œμ—λŠ” μ •μ˜μ—μ„œ λ§€κ°œλ³€μˆ˜κ°€ 있던 μžλ¦¬μ— 인자λ₯Ό λ„£μ–΄μ€€λ‹€.
λ§ˆμ°¬κ°€μ§€λ‘œ, μ œλ„ˆλ¦­ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œμ—λŠ” μ •μ˜μ—μ„œ νƒ€μž… λ³€μˆ˜κ°€ 있던 μžλ¦¬μ— νƒ€μž… 인자λ₯Ό λ„£μ–΄μ€€λ‹€.
const languages: string[] = ['TypeScript', 'JavaScript']; const language = getFirstElem<string>(languages); // 이 λ•Œ language의 νƒ€μž…μ€ λ¬Έμžμ—΄

μ œλ„ˆλ¦­ νƒ€μž… 별칭

νƒ€μž… 별칭 μ •μ˜μ—λ„ μ œλ„ˆλ¦­μ„ μ‚¬μš©ν•  수 μžˆλ‹€. 이 λ•Œ νƒ€μž… λ³€μˆ˜ μ •μ˜λŠ” 별칭 이름 λ‹€μŒμ— λΆ™μ—¬ μ“΄λ‹€.
type MyArray<T> = T[]; const drinks: MyArray<string> = ['Coffee', 'Milk', 'Beer'];
νƒ€μž… λ³€μˆ˜μ™€ μ œλ„ˆλ¦­μ˜ 핡심은 μ—¬λŸ¬ νƒ€μž…μ— λŒ€ν•΄ λ™μž‘ν•˜λŠ” μš”μ†Œλ₯Ό μ •μ˜ν•˜λ˜, ν•΄λ‹Ή μš”μ†Œλ₯Ό μ‚¬μš©ν•  λ•Œκ°€ λ˜μ–΄μ•Ό μ•Œ 수 μžˆλŠ” νƒ€μž… 정보λ₯Ό μ •μ˜μ— μ‚¬μš©ν•˜λŠ” 것이닀.
μ΄λŸ¬ν•œ κ°œλ…μ΄ μ μš©λ˜λŠ” λ²”μœ„λŠ” ν•¨μˆ˜μ™€ νƒ€μž… 별칭에 κ΅­ν•œλ˜μ§€ μ•ŠλŠ”λ‹€.
μ œλ„ˆλ¦­μ„ μ΄μš©ν•΄ μΆ”ν›„ λ‹€λ£° μΈν„°νŽ˜μ΄μŠ€, 클래슀 λ“± λ‹€μ–‘ν•œ νƒ€μž…μ˜ ν‘œν˜„λ ₯을 λ†’νž 수 μžˆλ‹€.
4μž₯μ—μ„œ μΆ”ν›„ ν•΄λ‹Ή 주제λ₯Ό λ‹€λ£° λ•Œμ— μ’€ 더 μžμ„Ένžˆ 닀룬닀.