Jieunnyμ λΈλ‘κ·Έ
[TS] λ°°μ΄κ³Ό νν λ³Έλ¬Έ
π£ λ°°μ΄ μ΄ν΄νκΈ°
βοΈ λ°°μ΄μ 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...'
'Study > TypeScript' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[TS] Promiseμ async/await ꡬ문 (0) | 2023.02.06 |
---|---|
[TS] λ°λ³΅κΈ°μ μμ±κΈ° (0) | 2023.02.03 |
[TS] ν¨μμ λ©μλ (0) | 2023.02.01 |
[TS] κ°μ²΄μ νμ (2) | 2023.02.01 |
[TS] νμ μ€ν¬λ¦½νΈ νλ‘μ νΈ λ§λ€κΈ° (0) | 2023.01.30 |