Jieunny의 λΈ”λ‘œκ·Έ

[TS] λ°°μ—΄κ³Ό νŠœν”Œ λ³Έλ¬Έ

Study/TypeScript

[TS] λ°°μ—΄κ³Ό νŠœν”Œ

Jieunny 2023. 2. 2. 14:09

πŸ“£  λ°°μ—΄ μ΄ν•΄ν•˜κΈ°

βœ”οΈ 배열은 Array 클래슀의 μΈμŠ€ν„΄μŠ€

βœ”οΈ 배열에 λ‹΄κΈ΄ 각각의 값을 μ•„μ΄ν…œ λ˜λŠ” μ›μ†Œ 라고 λΆ€λ₯Έλ‹€.

βœ”οΈ λ°°μ—΄μ€ Array 클래슀의 μΈμŠ€ν„΄μŠ€μ΄λ©°, μΈμŠ€ν„΄μŠ€λŠ” κ°μ²΄μ΄λ―€λ‘œ 배열은 '객체' 이닀.

let array = new Array(2)

 

πŸ“  [] 단좕 ꡬ문

let numbers = [1, 2, 3]
let strings = ['hello', 'world']

➰ [] λΌλŠ” 단좕 ꡬ문을 μ‚¬μš©ν•΄μ„œ 배열을 생성할 수 μžˆλ‹€.

 

πŸ“  λ°°μ—΄μ˜ νƒ€μž…

➰ νƒ€μž…μŠ€ν¬λ¦½νŠΈμ—μ„œ λ°°μ—΄μ˜ νƒ€μž…μ€ 'μ•„μ΄ν…œ νƒ€μž…[]' 이닀.

let numArray: number[] = [1, 2, 3]
let strArray: string[] = ['hello', 'world']

type IPerson = {name: string, age?: number}
let personArray: IPerson[] = [{name: 'Jack'}, {name: 'Jane', age: 32}]

 

πŸ“  λ¬Έμžμ—΄κ³Ό λ°°μ—΄ κ°„ λ³€ν™˜

➰ λ¬Έμžμ—΄ -> λ°°μ—΄ : split λ©”μ„œλ“œ

const split = (str: string, delim: string=''): string[] => str.aplit(delim)

split('hello')	// ['h', 'e', 'l', 'l', 'o']
split('h_e_l_l_o', '_') // ['h', 'e', 'l', 'l', 'o']

 

➰ λ°°μ—΄ -> λ¬Έμžμ—΄ : join λ©”μ„œλ“œ

const join = (strArray: string[], delim: string=''): string => strArray.join(delim)

join(['h', 'e', 'l', 'l', 'o']) // hello
join(['h', 'e', 'l', 'l', 'o'], '_') // h_e_l_l_o

 

πŸ“  인덱슀 μ—°μ‚°μž

➰ 인덱슀 μ—°μ‚°μžλŠ” λ°°μ—΄μ˜ νŠΉμ • μœ„μΉ˜μ— μžˆλŠ” μ•„μ΄ν…œμ„ μ–»λŠ”λ‹€.

const numbers: number[] = [1, 2, 3, 4, 5]
for(let index = 0; index < numbers.length; index++){
    const item: number = numbers[index]
    console.log(number) // 1 2 3 4 5
}

 

πŸ“  λ°°μ—΄μ˜ 비ꡬ쑰화 ν• λ‹Ή

➰ 객체와 달리 [] 기호λ₯Ό μ‚¬μš©ν•œλ‹€.

let array: number[] = [1, 2, 3, 4, 5]
let [first, second, third, ...rest] = array
// 1 2 3 [4, 5]

 

πŸ“  for...in λ¬Έ & for...of λ¬Έ

for...in for...of
λ°°μ—΄μ˜ 인덱슀 값을 μˆœνšŒν•œλ‹€.
객체가 가진 속성을 μˆœνšŒν•œλ‹€.
λ°°μ—΄μ˜ μ•„μ΄ν…œ 값을 μˆœνšŒν•œλ‹€.

let names = ['Jack', 'Jane', 'Steve']

for(let index in names) {
    console.log(index)	// 0, 1, 2
}

for(let item of names) {
    console.log(item) // 'Jack' 'Jane' 'Steve'
}

 

πŸ“  μ œλ„€λ¦­ 방식 νƒ€μž…

➰ νƒ€μž…μ„ T와 같은 μΌμ’…μ˜ λ³€μˆ˜(νƒ€μž… λ³€μˆ˜)둜 μ·¨κΈ‰ν•˜λŠ” 것을 μ œλ„€λ¦­ νƒ€μž… 이라고 ν•œλ‹€.

➰ Tκ°€ νƒ€μž… λ³€μˆ˜λΌλŠ” 것을 μ•Œλ €μ£ΌκΈ° μœ„ν•΄ <> 기호λ₯Ό μ‚¬μš©ν•œλ‹€.

const arrayLength = <T>(array: T[]): number => array.length
const isEmpty = <T>(array: T[]): boolean => arrayLength<T>(array) === 0

 

πŸ“  μ œλ„€λ¦­ ν•¨μˆ˜μ˜ νƒ€μž… μΆ”λ‘ 

const identity = <T>(n: T): T => n

identity<boolean>(true)
// ν•¨μˆ˜ 이름<νƒ€μž… λ³€μˆ˜>(λ§€κ°œλ³€μˆ˜)

identity(true)

➰ μ›λž˜λŠ” 2번째 쀄 ν˜•νƒœλ‘œ λͺ…μ‹œν•΄μ•Ό ν•˜μ§€λ§Œ, νƒ€μž… λ³€μˆ˜ 뢀뢄을 μƒλž΅ν•  수 μžˆλ‹€.

➰ νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” νƒ€μž… λ³€μˆ˜κ°€ μƒλž΅λœ μ œλ„€λ¦­ ν•¨μˆ˜λ₯Ό λ§Œλ‚˜λ©΄, νƒ€μž… 좔둠을 톡해 μƒλž΅λœ νƒ€μž…μ„ μ°Ύμ•„λ‚Έλ‹€.

 

πŸ“  μ œλ„€λ¦­ ν•¨μˆ˜μ˜ ν•¨μˆ˜ μ‹œκ·Έλ‹ˆμ²˜

const error = (cb: (number, number?) => number): void) => {}
// (number, number?) 뢀뢄에 였λ₯˜ λ°œμƒ

➰ νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” μ–΄λ–€ 경우 ν•¨μˆ˜ μ‹œκ·Έλ‹ˆμ²˜μ˜ λ§€κ°œλ³€μˆ˜ 뢀뢄에 λ³€μˆ˜ 이름을 κΈ°μž…ν•˜λΌκ³  μš”κ΅¬ν•œλ‹€.

 

 

const f = <T>(cb: (arg: T, i?: number) => number): void => {}

➰ νƒ€μž…μŠ€ν¬λ¦½νŠΈκ°€ ν•΄μ„ν•˜μ§€ λͺ»ν•˜λŠ” 뢀뢄에 λ³€μˆ˜λ₯Ό μ‚½μž…ν•˜κ³  이 λ³€μˆ˜μ— νƒ€μž…μ„ λͺ…μ‹œν•΄μ€˜μ•Ό ν•œλ‹€.

 

πŸ“  μ „κ°œ μ—°μ‚°μž(spread operator)

➰ 점 μ„Έκ°œκ°€ λ‚˜λž€νžˆ μžˆλŠ” ...을 μ „κ°œ μ—°μ‚°μž 라고 ν•œλ‹€.

let arr1: number[] = [1]
let arr2: number[] = [2, 3]
let mergedArr: number[] = [...arr1, ...arr2, 4]
mergedArr // [1, 2, 3, 4]

 

πŸ“  range ν•¨μˆ˜ κ΅¬ν˜„

➰ range ν•¨μˆ˜λŠ” from λΆ€ν„° to κΉŒμ§€ 수둜 κ΅¬μ„±λœ 배열을 μƒμ„±ν•œλ‹€.

const range = (from: number, to: number): number[] =>
    from < to ? [from, ...range(from + 1, to)] : []
    
let numbers: number[] = range(1, 9+1)
numbers // [1, 2, 3, 4, 5, 6, 7, 8, 9]

πŸ“£  μ„ μ–Έν˜• ν”„λ‘œκ·Έλž˜λ°κ³Ό λ°°μ—΄

ν•¨μˆ˜ν˜•, μ„ μ–Έν˜•, λͺ…λ Ήν˜• ν”„λ‘œκ·Έλž˜λ° 관계도

 

πŸ“  λͺ…λ Ήν˜• ν”„λ‘œκ·Έλž˜λ° & μ„ μ–Έν˜• ν”„λ‘œκ·Έλž˜λ°

λͺ…λ Ήν˜• ν”„λ‘œκ·Έλž˜λ° μ„ μ–Έν˜• ν”„λ‘œκ·Έλž˜λ°
μ—¬λŸ¬ 개의 데이터λ₯Ό λŒ€μƒμœΌλ‘œ ν•  λ•Œ for문을 μ‚¬μš© for문을 μ‚¬μš©ν•˜μ§€ μ•Šκ³  λͺ¨λ“  데이터λ₯Ό 배열에 λ‹΄μ•„ λ¬Έμ œκ°€ 해결될 λ•ŒκΉŒμ§€ 또 λ‹€λ₯Έ ν˜•νƒœμ˜ λ°°μ—΄λ‘œ κ°€κ³΅ν•˜λŠ” 방식
// 1λΆ€ν„° 100κΉŒμ§€ λ”ν•˜κΈ°

// λͺ…λ Ήν˜•
for(let val = 1 ; val <= 100)
   sum += val++
   
   
// μ„ μ–Έν˜• 
// 일단 λ°μ΄ν„°λ§Œ λ°°μ—΄λ‘œ 생성
let numbers: number[] = range(1, 100+1)

➰ μ„ μ–Έν˜•μ€ 데이터 생성과 가곡 과정을 λΆ„λ¦¬ν•˜λ©°, 이미 λ²”μš©μœΌλ‘œ κ΅¬ν˜„λœ(ν˜Ήμ€ μ–Έμ–΄κ°€ μ œκ³΅ν•˜λŠ”) ν•¨μˆ˜λ₯Ό μž¬μ‚¬μš© ν•˜λ©΄μ„œ 문제λ₯Ό ν•΄κ²°ν•œλ‹€.


πŸ“£  λ°°μ—΄μ˜ map, reduce, filter λ©”μ„œλ“œ

πŸ“  filter λ©”μ„œλ“œ

➰ 쑰건에 λ§žλŠ” μ•„μ΄ν…œλ§Œ μΆ”λ €λ‚΄λŠ” ν•¨μˆ˜

➰ 두 번째 λ§€κ°œλ³€μˆ˜μ— indexλΌλŠ” 선택 속성을 μ œκ³΅ν•œλ‹€.

filter(callback: (value: T, index?: number): boolean): T[]
const array: number[] = range(1, 10+1)
const half = array.length / 2

let belowHalf: number[] = array.filter((v,index) => index < half)
let overHalf: number[] = array.filter((v, index) => index >= half)

 

πŸ“  map λ©”μ„œλ“œ

➰ λ°°μ—΄ 데이터λ₯Ό κ°€κ³΅ν•˜λŠ” ν•¨μˆ˜

➰ filter λ©”μ„œλ“œμ™€ 달리 map λ©”μ„œλ“œλŠ” μž…λ ₯ νƒ€μž…κ³Ό λ‹€λ₯Έ νƒ€μž…μ˜ 배열을 λ§Œλ“€ 수 μžˆλ‹€.

map(callback: (value: T, index?: number): Q): Q[]
let names: string[] = range(1, 5+1).map((val, index) => `[${index}]: ${val}`)
// number[] νƒ€μž… 배열을 string[] νƒ€μž… λ°°μ—΄λ‘œ 가곡

 

πŸ“  reduce λ©”μ„œλ“œ

➰ T[] νƒ€μž… 배열을 κ°€κ³΅ν•΄μ„œ T νƒ€μž… κ²°κ³Όλ₯Ό λ§Œλ“€μ–΄μ€€λ‹€.

reduce(callback: (result: T, value: T), initialValue: T): T
let reduceSum: number = range(1, 100+1)
    .reduce((result: number, value: number) => result + value, 0)
// 1λΆ€ν„° 100κΉŒμ§€ λ”ν•˜λŠ” κΈ°λŠ₯

πŸ“£  순수 ν•¨μˆ˜μ™€ λ°°μ—΄

βœ”οΈ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ—μ„œ ν•¨μˆ˜λŠ” '순수 ν•¨μˆ˜' λΌλŠ” 쑰건을 λ§Œμ‘±ν•΄μ•Ό ν•œλ‹€.

 

πŸ“  순수 ν•¨μˆ˜λž€?

➰ λΆ€μˆ˜ νš¨κ³Όκ°€ μ—†λŠ” ν•¨μˆ˜ <-> 뢈순 ν•¨μˆ˜

➰ λΆ€μˆ˜ 효과 : ν•¨μˆ˜κ°€ 가진 κ³ μœ ν•œ λͺ©μ  이외에 λ‹€λ₯Έ νš¨κ³Όκ°€ λ‚˜νƒ€λ‚˜λŠ” 것

➰ 순수 ν•¨μˆ˜μ˜ 쑰건

더보기

οΉ’ ν•¨μˆ˜ λͺΈν†΅μ— μž…μΆœλ ₯ κ΄€λ ¨ μ½”λ“œκ°€ μ—†μ–΄μ•Ό ν•œλ‹€.

οΉ’ ν•¨μˆ˜ λͺΈν†΅μ—μ„œ λ§€κ°œλ³€μˆ«κ°’μ„ λ³€κ²½μ‹œν‚€μ§€ μ•ŠλŠ”λ‹€(즉, λ§€κ°œλ³€μˆ˜λŠ” constλ‚˜ readonly ν˜•νƒœλ‘œλ§Œ μ‚¬μš©ν•œλ‹€)

οΉ’ ν•¨μˆ˜λŠ” λͺΈν†΅μ—μ„œ λ§Œλ“€μ–΄μ§„ κ²°κ³Όλ₯Ό μ¦‰μ‹œ λ°˜ν™˜ν•œλ‹€.

οΉ’ ν•¨μˆ˜ 내뢀에 μ „μ—­ λ³€μˆ˜λ‚˜ 정적 λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€.

οΉ’ ν•¨μˆ˜κ°€ μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚€μ§€ μ•ŠλŠ”λ‹€.

οΉ’ ν•¨μˆ˜κ°€ 콜백 ν•¨μˆ˜λ‘œ κ΅¬ν˜„λ˜μ—ˆκ±°λ‚˜ ν•¨μˆ˜ λͺΈν†΅μ— 콜백 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” μ½”λ“œκ°€ μ—†λ‹€.

οΉ’ ν•¨μˆ˜ λͺΈν†΅μ— Promise와 같은 비동기 λ°©μ‹μœΌλ‘œ λ™μž‘ν•˜λŠ” μ½”λ“œκ°€ μ—†λ‹€.

// 순수 ν•¨μˆ˜
function pure(a: number, b: number): number {return a + b}

// 뢈순 ν•¨μˆ˜
// λ§€κ°œλ³€μˆ˜κ°€ readonly ν˜•νƒœλ‘œ λ™μž‘ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ—(λ§€κ°œλ³€μˆ«κ°’μ΄ λ³€κ²½λ˜μ—ˆκΈ° λ•Œλ¬Έ)
function impure(array: number[]): void {
    array.push(1)
    array.splice(0, 1)
}

// gλΌλŠ” μ™ΈλΆ€ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λ―€λ‘œ 
let g = 10
function impure2(x: number) {return x + g}

 

πŸ“  νƒ€μž… μˆ˜μ •μž readonly

➰ νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” readonly νƒ€μž…μœΌλ‘œ μ„ μ–Έλœ λ§€κ°œλ³€μˆ«κ°’μ„ λ³€κ²½ν•˜λŠ” μ‹œλ„κ°€ 있으면 λ¬Έμ œκ°€ μžˆλŠ” μ½”λ“œλΌκ³  μ•Œλ €μ€€λ‹€.

➰ readonlyκ°€ 뢙은 λ³€μˆ˜λŠ” λ³€κ²½ν•  수 μ—†λ‹€λŠ” 의미의 λΆˆλ³€ λ³€μˆ˜μ΄λ‹€.

βž• constκ°€ μžˆλŠ”λ° 또 readonlyκ°€ ν•„μš”ν•œκ°€?

더보기

➰ νƒ€μž…μŠ€ν¬λ¦½νŠΈμ—μ„œ μΈν„°νŽ˜μ΄μŠ€, 클래슀, ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜ 등은 letμ΄λ‚˜ const ν‚€μ›Œλ“œ 없이 μ„ μ–Έν•œλ‹€.

➰ λ”°λΌμ„œ const와 같은 효과λ₯Ό μ£Όλ €λ©΄ readonlyκ°€ ν•„μš”ν•˜λ‹€.

 

πŸ“  κΉŠμ€ 볡사와 얕은 볡사

➰ 볡사 : μ–΄λ–€ λ³€μˆ«κ°’μ„ λ‹€λ₯Έ λ³€μˆ«κ°’μœΌλ‘œ μ„€μ •ν•˜λŠ” 것

➰ κΉŠμ€ 볡사 : λŒ€μƒ λ³€μˆ«κ°’μ΄ λ°”λ€” λ•Œ 원본 λ³€μˆ«κ°’μ€ κ·ΈλŒ€λ‘œμΈ ν˜•νƒœλ‘œ λ™μž‘ν•œλ‹€.

➰ μ–•μ€ 볡사 : λŒ€μƒ λ³€μˆ«κ°’μ΄ λ°”λ€” λ•Œ 원본 λ³€μˆ«κ°’λ„ λ³€κ²½λœλ‹€.

➰ number와 boolean νƒ€μž…μ€ κΉŠμ€ 볡사 ν˜•νƒœλ‘œ, λ°°μ—΄κ³Ό κ°μ²΄λŠ” 얕은 볡사 ν˜•νƒœλ‘œ λ™μž‘ν•œλ‹€.

➰ 순수 ν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν•  λ•ŒλŠ” λ§€κ°œλ³€μˆ˜κ°€ λΆˆλ³€μ„±μ„ μœ μ§€ν•΄μ•Ό ν•˜λ―€λ‘œ, λ§€κ°œλ³€μˆ˜λ₯Ό κ°€κ³΅ν•˜λ € ν•  λ•Œ κΉŠμ€ 볡사λ₯Ό μ‹€ν–‰ν•΄μ•Ό ν•œλ‹€.

// κΉŠμ€ 볡사
let orginal = 1
let copied = original
copied += 2	// 원본 값인 original은 λ³€κ²½λ˜μ§€ μ•ŠλŠ”λ‹€.

// 얕은 볡사
const originalArray = [5, 3, 9, 7]
const shallowCopiedArray = originalArray
shallowCopiedArray[0] = 0 // 원본 값인 originalArray의 0번째 인덱슀 값도 λ³€κ²½λœλ‹€.

 

πŸ“  μ „κ°œ μ—°μ‚°μžμ™€ κΉŠμ€ 볡사

➰ μ „κ°œ μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜λ©΄ 배열도 κΉŠμ€ 볡사λ₯Ό ν•  수 μžˆλ‹€.

const oArray = [1, 2, 3, 4]
const deepCopiedArray = [...oArray]
deepCopiedArray[0] = 0	// κΉŠμ€ 볡사가 됬기 λ•Œλ¬Έμ— 원본 값인 oArray의 0번째 μΈλ±μŠ€λŠ” λ³€κ²½λ˜μ§€ μ•ŠλŠ”λ‹€.

 

πŸ“  λ°°μ—΄μ˜ sort λ©”μ„œλ“œλ₯Ό 순수 ν•¨μˆ˜λ‘œ κ΅¬ν˜„ν•˜κΈ°

➰ sort λ©”μ„œλ“œλŠ” 원본 λ°°μ—΄μ˜ λ‚΄μš©μ„ λ³€κ²½ν•˜λ―€λ‘œ 순수 ν•¨μˆ˜κ°€ μ•„λ‹ˆλ‹€.

➰ readonly νƒ€μž…κ³Ό μ „κ°œ μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•΄μ„œ 순수 ν•¨μˆ˜λ‘œ κ΅¬ν˜„ν•  수 μžˆλ‹€.

const pureSort = <T>(array: readonly T[]): T[] => {
    // arrayλŠ” readonly둜 변경될 수 μ—†λ‹€.
    let deepCopied = [...array]
    // μ „κ°œ μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•΄μ„œ κΉŠμ€ 볡사 κΈ°λŠ₯을 μ‚¬μš©ν•œλ‹€.
    return deepCopied.sort()
}

 

πŸ“  λ°°μ—΄μ˜ filter λ©”μ„œλ“œμ™€ μˆœμˆ˜ν•œ μ‚­μ œ

➰ λ°°μ—΄μ—μ„œ νŠΉμ • μ•„μ΄ν…œμ„ μ‚­μ œν•  λ•ŒλŠ” splice λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ”λ°, splice λ©”μ„œλ“œλŠ” 원본 λ°°μ—΄μ˜ λ‚΄μš©μ„ λ³€κ²½ν•˜λ―€λ‘œ 순수 ν•¨μˆ˜μ—μ„œλŠ” μ‚¬μš©ν•  수 μ—†λ‹€.

➰ κ·Έλž˜μ„œ spliceκ°€ μ•„λ‹Œ, νŠΉμ • μ•„μ΄ν…œμ„ μ‚­μ œν•˜λŠ” 데 filter λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

➰ filter와 map λ©”μ„œλ“œλŠ” κΉŠμ€ 볡사 ν˜•νƒœλ‘œ λ™μž‘ν•œλ‹€.

const pureDelete = <T>(array: readonly T[], cb: (val: T, index?: number) => boolean): T[] 
    => array.filter((val, index) => cb(val, index) == false)
    // cbλŠ” μ½œλ°±ν•¨μˆ˜, filter 쑰건을 κ±°λ₯΄λŠ” ν•¨μˆ˜
const mixedArray: object[] = [
    [], {name: 'Jack'}, {name: 'Jane', age: 32}, ['description']
]

const objectsOnly: object[] = pureDelete(mixedArray, (val) => Array.isArray(val))
objectsOnly // [ {name: 'Jack'}, {name: 'Jane', age: 32} ]

 

πŸ“  κ°€λ³€ 인수 ν•¨μˆ˜μ™€ 순수 ν•¨μˆ˜

➰ κ°€λ³€ 인수 : ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ μ „λ‹¬ν•˜λŠ” 인수의 개수λ₯Ό μ œν•œν•˜μ§€ μ•ŠλŠ” 것

const mergeArray = (...arrays) -> {}

➰ ...은 μž”μ—¬λ‚˜ μ „κ°œ μ—°μ‚°μžκ°€ μ•„λ‹ˆλΌ κ°€λ³€ 인수λ₯Ό ν‘œν˜„ν•˜λŠ” ꡬ문이닀.

 

const mergeArray = <T>(...array: readonly T[][]): T[] => {}

➰ mergeArray ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ μ „λ‹¬ν•˜λŠ” 값은 λͺ¨λ‘ λ°°μ—΄μ΄λ―€λ‘œ, λ§€κ°œλ³€μˆ˜ arrays의 νƒ€μž…μ€ λ°°μ—΄μ˜ 배열이닀.

➰ 좜λ ₯은 T[] ν˜•νƒœμ˜ 배열이닀.

➰ 순수 ν•¨μˆ˜λŠ” λ§€κ°œλ³€μˆ˜μ˜ λ‚΄μš©μ„ λ³€κ²½ν•˜λ©΄ μ•ˆλ˜λ‹ˆκΉŒ λ§€κ°œλ³€μˆ˜ νƒ€μž… μ•žμ— readonly ν‚€μ›Œλ“œλ₯Ό μž…λ ₯ν•œλ‹€.

 

const mergeArray = <T>(...arrays: readonly T[][]): T[] => {
    let result: T[] = []
    for(let index=0; index<arrays.length; index++) {
        const array: T[] = arrays[index]
        
        result = [...result, ...array]
    }
    return result
}

πŸ“£  νŠœν”Œ μ΄ν•΄ν•˜κΈ°

➰ νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” νŠœν”Œμ˜ νƒ€μž… ν‘œκΈ°λ²•μ„ λ°°μ—΄κ³Ό λ‹€λ₯΄κ²Œ μ„ μ–Έν•  수 μžˆλ‹€.

// λ°°μ—΄
const array: number[] = [1, 2, 3, 4]

// νŠœν”Œ
const tuple: [boolean, string] = [true, 'the result is ok']

 

πŸ“  νŠœν”Œμ— νƒ€μž… 별칭 μ‚¬μš©ν•˜κΈ°

➰ νŠœν”Œμ„ μ‚¬μš©ν•  λ•ŒλŠ” νƒ€μž… 별칭을 μ‚¬μš©ν•΄ νŠœν”Œμ΄ μ–΄λ–€ μš©λ„λ‘œ μ‚¬μš©λ˜λŠ”μ§€ μ’€ 더 λΆ„λͺ…ν•˜κ²Œ μ•Œλ €μ£ΌλŠ” 것이 μ’‹λ‹€.

type ResultType = [boolean, string]

const doSomething = (): ResultType => {
    try {
        throw new Error('Some error occurs...')
    } catch(e) {
        return [false, e.message]
    }
}

➰ μ˜ˆμ™Έκ°€ λ°œμƒν–ˆμ„ λ•Œ ꡬ체적인 λ‚΄μš©μ„ νŠœν”Œλ‘œ λ°˜ν™˜ν•œλ‹€.

 

πŸ“  νŠœν”Œμ— μ μš©ν•˜λŠ” 비ꡬ쑰화 ν• λ‹Ή

const [result, errorMessage] = doSomething()
result // false
errorMessage // 'Some error occurs...'