Jieunny의 λΈ”λ‘œκ·Έ

[TS] ν•¨μˆ˜μ™€ λ©”μ„œλ“œ λ³Έλ¬Έ

Study/TypeScript

[TS] ν•¨μˆ˜μ™€ λ©”μ„œλ“œ

Jieunny 2023. 2. 1. 17:46

πŸ“£  ν•¨μˆ˜ μ„ μ–Έλ¬Έ

πŸ“ ν•¨μˆ˜ μ„ μ–Έλ¬Έ 

➰ λ§€κ°œλ³€μˆ˜, ν•¨μˆ˜ λ°˜ν™˜κ°’μ— νƒ€μž… 주석을 λΆ™μ΄λŠ” ν˜•νƒœ

➰ λ³€μˆ˜ λ•Œμ™€λŠ” 달리 ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜ νƒ€μž…κ³Ό λ°˜ν™˜ νƒ€μž…μ„ μƒλž΅ν•˜λŠ” 것은 쒋지 μ•Šλ‹€!

function add(a: number, b: number): number {
    return a + b
}

βž• λ§€κ°œλ³€μˆ˜μ™€ 인자, 인수

더보기

βœ”οΈ λ§€κ°œλ³€μˆ˜(paramater)

➰ ν•¨μˆ˜ μ„ μ–Έλ¬Έμ—μ„œ ν•¨μˆ˜ 이름 λ’€ κ΄„ν˜Έ μ•ˆμ— μ„ μ–Έν•˜λŠ” λ³€μˆ˜

 

βœ”οΈ 인수 or 인자(argument)

➰ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ μ „λ‹¬ν•˜λŠ” κ°’

 

πŸ“ void νƒ€μž…

➰ 값을 λ°˜ν™˜ν•˜μ§€ μ•ŠλŠ” ν•¨μˆ˜λŠ” λ°˜ν™˜ νƒ€μž…μ΄ void이닀.

function printMe(name: string, age: number): void {
    console.log(...)
}

 

πŸ“ ν•¨μˆ˜ μ‹œκ·Έλ‹ˆμ²˜

➰ ν•¨μˆ˜μ˜ νƒ€μž…μ„ ν•¨μˆ˜ μ‹œκ·Έλ‹ˆμ²˜λΌκ³  ν•œλ‹€.

let printMe: (string, number) => void = function(name: string, age: number): void {}

➰ μœ„ μ½”λ“œμ—μ„œ ν•¨μˆ˜ μ‹œκ·Έλ‹ˆμ²˜λŠ” (string, number) => void 이닀.

➰ λ§€κ°œλ³€μˆ˜κ°€ μ—†μœΌλ©΄ λ‹¨μˆœνžˆ ()둜 ν‘œν˜„ν•œλ‹€.

 

πŸ“ type ν‚€μ›Œλ“œλ‘œ νƒ€μž… 별칭 λ§Œλ“€κΈ°

➰ type ν‚€μ›Œλ“œλŠ” 기쑴에 μ‘΄μž¬ν•˜λŠ” νƒ€μž…μœΌλ₯΄ λ‹¨μˆœνžˆ μ΄λ¦„λ§Œ λ°”κΏ”μ„œ μ‚¬μš©ν•  수 있게 ν•΄μ€€λ‹€.

type stringNumberFunc = (string, number) => void
let f: stringNumberFunc = function(a: string, b: number): void {}
// fλŠ” stringNumberFunc νƒ€μž…μ΄κ³ , λ§€κ°œλ³€μˆ˜ a와 bλ₯Ό λ°›κ³  아무 값도 λ°˜ν™˜ν•˜μ§€ μ•ŠλŠ”λ‹€.

➰ λ§€κ°œλ³€μˆ˜μ˜ κ°œμˆ˜λ‚˜ νƒ€μž…, λ°˜ν™˜ νƒ€μž…μ΄ λ‹€λ₯Έ ν•¨μˆ˜λ₯Ό μ„ μ–Έν•˜λŠ” 잘λͺ»μ„ 방지할 수 μžˆλ‹€.

 

πŸ“ undefined κ΄€λ ¨ 주의 사항

interface INameable {
    name: string
}
function getName(o: INameable) {return o.name}

let n = getName(undefined)
console.log(n)

➰ getName은 INameable νƒ€μž…μ˜ λ§€κ°œλ³€μˆ˜λ₯Ό μš”κ΅¬ν•œλ‹€.

➰ undefinedλŠ” μ΅œν•˜μœ„ νƒ€μž…μ΄λ―€λ‘œ INameable을 μƒμ†ν•˜λŠ” μžμ‹ νƒ€μž…μœΌλ‘œ κ°„μ£Όν•΄μ„œ ꡬ문 였λ₯˜κ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€.

➰ ν•˜μ§€λ§Œ o.name이 undefined.name이 λ˜μ–΄ 였λ₯˜κ°€ λ°œμƒν•œλ‹€.

➰ 이λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ§€κ°œλ³€μˆ˜ 값이 undefined인지 νŒλ³„ν•˜λŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ•Ό ν•œλ‹€.

unterface IAgeable {
    age?: number
}
function getAge(o: IAgeable) {
    return o != undefined && o.age ? o.age : 0
    // ageκ°€ 선택 μ†μ„±μ΄λ―€λ‘œ μ—†λŠ” κ²½μš°λ„ 생각해쀀닀.
}

 

πŸ“ 선택적 λ§€κ°œλ³€μˆ˜

➰ ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜μ—λ„ 이름 뒀에 λ¬ΌμŒν‘œλ₯Ό λΆ™μ΄λŠ” 선택적 λ§€κ°œλ³€μˆ˜κ°€ μžˆλ‹€.

function fn(arg1: string, arg?: number): void {}

// 선택적 λ§€κ°œλ³€μˆ˜κ°€ μžˆλŠ” ν•¨μˆ˜μ˜ μ‹œκ·Έλ‹ˆμ²˜
type OptionalArgFunc = (string, number?) => void

πŸ“£  ν•¨μˆ˜ ν‘œν˜„μ‹

πŸ“ ν•¨μˆ˜λŠ” 객체닀

let add2 = function(a, b) {return a + b}

➰ μœ„μ™€ 같은 ν•¨μˆ˜ μ„ μ–Έλ¬Έμ—μ„œ ν•¨μˆ˜ 이름을 μ œμ™Έν•œ 'function(a, b) {return a + b}' 와 같은 μ½”λ“œλ₯Ό ν•¨μˆ˜ ν‘œν˜„μ‹ 이라고 ν•œλ‹€.

 

πŸ“ 일등 ν•¨μˆ˜

➰ 일등 ν•¨μˆ˜λž€, ν•¨μˆ˜μ™€ λ³€μˆ˜λ₯Ό κ΅¬λΆ„ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” μ˜λ―Έμ΄λ‹€.

let f = function(a, b) {return a + b}
f = function(a, b) {return a - b}

➰ λ³€μˆ˜ f에 ν•¨μˆ˜ ν‘œν˜„μ‹μ„ μ €μž₯ν•  수 μžˆλ‹€.

➰ fκ°€ λ³€μˆ˜μΈμ§€ ν•¨μˆ˜μΈμ§€ 사싀상 ꡬ뢄할 수 μ—†λ‹€.

 

πŸ“ ν‘œν˜„μ‹

➰ ν‘œν˜„μ‹ : λ¦¬ν„°λŸ΄, μ—°μ‚°μž, λ³€μˆ˜, ν•¨μˆ˜ 호좜 등이 λ³΅ν•©μ μœΌλ‘œ κ΅¬μ„±λœ μ½”λ“œ ν˜•νƒœλ₯Ό 의미

➰ ν‘œν˜„μ‹μ€ 항상 μ»΄νŒŒμΌλŸ¬μ— μ˜ν•΄ 계산법이 μ μš©λ˜μ–΄ μ–΄λ–€ 값이 λœλ‹€.

1 + 2 // ν‘œν˜„μ‹
3 // μ»΄νŒŒμΌλŸ¬μ— μ˜ν•œ κ°’

 

πŸ“ 계산법

➰ μ»΄νŒŒμΌλŸ¬κ°€ 1+2 λΌλŠ” ν‘œν˜„μ‹μ„ λ§Œλ‚˜λ©΄ 'μ‘°κΈ‰ν•œ 계산법'을 μ μš©ν•΄ 3μ΄λΌλŠ” 값을 λ§Œλ“ λ‹€.

➰ function(a, b) {return a + b} λΌλŠ” ν•¨μˆ˜ ν‘œν˜„μ‹μ„ λ§Œλ‚˜λ©΄ a와 bκ°€ μ–΄λ–€ 값인지 μ•Œ 수 μ—†μ–΄μ„œ 'λŠκΈ‹ν•œ 계산법'을 μ μš©ν•΄ 계산을 보λ₯˜ν•œλ‹€.

 

πŸ“ ν•¨μˆ˜ 호좜 μ—°μ‚°μž

➰ μ–΄λ–€ λ³€μˆ˜κ°€ ν•¨μˆ˜ ν‘œν˜„μ‹μ„ λ‹΄κ³  μžˆλ‹€λ©΄, λ³€μˆ˜ 이름 뒀에 ν•¨μˆ˜ 호좜 μ—°μ‚°μž () λ₯Ό λΆ™μ—¬μ„œ ν˜ΈμΆœν•  수 μžˆλ‹€.

➰ ν•¨μˆ˜ 호좜 : ν•¨μˆ˜ ν‘œν˜„μ‹μ˜ λͺΈν†΅ 뢀뢄을 μ‹€ν–‰ν•œλ‹€λŠ” 뜻

let functionExpression = function(a, b) {return a + b}
let value = functionExpression(1, 2) // 3

➰ ν•¨μˆ˜ ν˜ΈμΆœλ¬Έμ„ λ§Œλ‚˜λ©΄ 미뀘던 ν•¨μˆ˜ ν‘œν˜„μ‹μ— μ‘°κΈ‰ν•œ 계산법을 μ μš©ν•΄ ν•¨μˆ˜ ν‘œν˜„μ‹μ„ κ°’μœΌλ‘œ λ°”κΎΌλ‹€.

 

πŸ“ 읡λͺ… ν•¨μˆ˜

let value = (function(a, b) {return a + b;})(1, 2)

➰ ν•¨μˆ˜ 호좜 μ—°μ‚°μžλŠ” μ—°μ‚°μžμ˜ μš°μ„ μˆœμœ„κ°€ 맀우 λ†’μœΌλ―€λ‘œ ν•¨μˆ˜ ν‘œν˜„μ‹ 뢀뢄을 μ†Œκ΄„ν˜Έλ‘œ λ¬Άμ–΄μ„œ μ»΄νŒŒμΌλŸ¬κ°€ μ •μƒμ μœΌλ‘œ ν•¨μˆ˜ ν‘œν˜„μ‹μ˜ μ‹œμž‘κ³Ό 끝 뢀뢄을 μ•Œ 수 있게 ν•΄μ•Όν•œλ‹€.

➰ 일반 ν•¨μˆ˜λŠ” μž¬μ‚¬μš©μ„±μ„ μœ„ν•΄ μ‚¬μš©ν•˜λŠ” λ°˜λ©΄μ—, 읡λͺ…ν•¨μˆ˜λŠ” λ³€μˆ˜μ— λ°”λ‘œ ν•¨μˆ˜ 호좜 κ²°κ³Όλ₯Ό λ„£μ–΄μ€ŒμœΌλ‘œμ¨ 읡λͺ…ν•¨μˆ˜μ˜ μ‚¬μš©μ„±μ€ 1νšŒμ„±μœΌλ‘œ λλ‚œλ‹€.

 

πŸ“ const ν‚€μ›Œλ“œμ™€ ν•¨μˆ˜ ν‘œν˜„μ‹

➰ ν•¨μˆ˜ ν‘œν˜„μ‹μ€ letλ³΄λ‹€λŠ” const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•˜λŠ” 것이 μ’‹λ‹€.


πŸ“£  ν™”μ‚΄ν‘œ ν•¨μˆ˜μ™€ ν‘œν˜„μ‹ λ¬Έ

πŸ“ ν™”μ‚΄ν‘œ ν•¨μˆ˜

// μ€‘κ΄„ν˜Έλ₯Ό μ‚¬μš©ν•˜λŠ” μ‹€ν–‰λ¬Έ 방식 λͺΈν†΅
const arrow1 = (a: number, b: number): number => {return a + b}

// μ€‘κ΄„ν˜Έλ₯Ό μƒλž΅ν•˜λŠ” ν‘œν˜„μ‹ λ¬Έ 방식 λͺΈν†΅
const arrow2 = (a: number, b: number): number => a + b

➰ μ€‘κ΄„ν˜Έ μ‚¬μš© 여뢀에 따라 μ‹€ν–‰λ¬Έ 방식과 ν‘œν˜„μ‹ λ¬Έ λ°©μ‹μœΌλ‘œ λ‚˜λ‰œλ‹€.

 

πŸ“ μ‹€ν–‰λ¬Έκ³Ό ν‘œν˜„μ‹ λ¬Έ

➰ ESNext와 νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” μ‹€ν–‰λ¬Έκ³Ό ν‘œν˜„μ‹ 문을 λ™μ‹œμ— μ§€μ›ν•œλ‹€ -> 닀쀑 νŒ¨λŸ¬λ‹€μž„ μ–Έμ–΄

➰ μ‹€ν–‰λ¬Έ : CPUμ—μ„œ μ‹€ν–‰λ§Œ 될 뿐 κ²°κ³Όλ₯Ό μ•Œλ €μ£Όμ§€ μ•ŠλŠ”λ‹€ (리턴문 ν•„μš”)

➰ ν‘œν˜„μ‹ λ¬Έ: CPUμ—μ„œ μ‹€ν–‰λœ κ²°κ³Όλ₯Ό ꡳ이 return ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ•„λ„ μ•Œλ €μ€€λ‹€ (리턴문 ν•„μš”X)

// λŒ€ν‘œμ μΈ μ‹€ν–‰λ¬Έ
let x
x = 1

➰ λ³€μˆ˜ x에 κ°’ 1을 μ„€μ •ν•˜λŠ” μž‘μ—…λ§ŒμœΌλ‘œ μΆ©λΆ„ν•˜λ‹€.

 

let x = 10
if(x > 0) x = 1

➰ x > 0 뢀뢄은 CPUκ°€ ν‰κ°€ν•œ ν›„ trueλ‚˜ false λΌλŠ” κ°’μœΌλ‘œ κ²°κ³Όλ₯Ό μ•Œλ €μ£Όμ§€ μ•ŠμœΌλ©΄ if문이 μ •μƒμ μœΌλ‘œ λ™μž‘ν•  수 μ—†λ‹€.

➰ λ˜‘κ°™μ΄ CPUμ—μ„œ μ‹€ν–‰λ˜λŠ” ꡬ문이더라고 return ν‚€μ›Œλ“œ 없이 결과값을 λ°˜ν™˜ν•˜λŠ” 싀행문이 ν•„μš”ν•˜λ‹€ => ν‘œν˜„μ‹ λ¬Έ

 

πŸ“ 볡합 μ‹€ν–‰λ¬Έ

➰ 볡합 μ‹€ν–‰λ¬Έ : μ€‘κ΄„ν˜Έ{} λ₯Ό μ‚¬μš©ν•΄μ„œ μ—¬λŸ¬ μ€„μ˜ 싀행문을 ν•œ 개 처럼 μΈμ‹ν•˜κ²Œ ν•˜λŠ” 것

if(쑰건식) {
    μ‹€ν–‰λ¬Έ1
    μ‹€ν–‰λ¬Έ2
}

 

πŸ“ ν•¨μˆ˜ λͺΈν†΅κ³Ό 볡합 μ‹€ν–‰λ¬Έ

function f() {
    let x = 1, y = 2
    let result = x + y + 10
}

➰ ν•¨μˆ˜λŠ” λ°˜λ“œμ‹œ λͺΈν†΅μ„ μ€‘κ΄„ν˜Έ{} 둜 감싸야 ν•˜λŠ”λ°, 이것이 λ°”λ‘œ 볡합 싀행문이닀.

➰ 볡합 싀행문은 λ³€μˆ˜μ˜ 유효 λ²”μœ„λ„ 지역 λ²”μœ„λ‘œ μ œν•œν•˜λ―€λ‘œ, 각 ν•¨μˆ˜μ˜ λͺΈν†΅μ—μ„œλ§Œ μœ νš¨ν•˜λ‹€.

 

πŸ“ return ν‚€μ›Œλ“œ

➰ μ‹€ν–‰λ¬Έ 기반 μ–Έμ–΄λŠ” CPUμ—μ„œ μ‹€ν–‰λœ κ²°κ³Όλ₯Ό μ•Œλ €μ£Όμ§€ μ•ŠλŠ” 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ return ν‚€μ›Œλ“œλ₯Ό λ„μž…ν–ˆλ‹€.

➰ return ν‚€μ›Œλ“œλŠ” ν•¨μˆ˜ λͺΈν†΅μ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆλ‹€λŠ” μ œμ•½μ΄ μžˆλ‹€!

function isGreater(a: number, b: number): boolean {
    return a > b	// trueλ‚˜ falseλ₯Ό λ°˜ν™˜ν•œλ‹€.
}

 

πŸ“ ν‘œν˜„μ‹ λ¬Έ μŠ€νƒ€μΌμ˜ ν™”μ‚΄ν‘œ ν•¨μˆ˜ κ΅¬ν˜„

const isGreater = (a: number, b: number): boolean => a > b

➰ ν•¨μˆ˜ λͺΈν†΅μ΄ ν‘œν˜„μ‹μœΌλ‘œ κ΅¬ν˜„λ˜μ—ˆκ³ , return ν‚€μ›Œλ“œ λ˜ν•œ μƒλž΅λ˜μ—ˆλ‹€.

➰ return ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λ €λ©΄ 항상 μ€‘κ΄„ν˜Έ{} 둜 볡합 싀행문을 λ§Œλ“  λ‹€μŒ κ·Έ μ•ˆμ— μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

 

πŸ“ ν‘œν˜„μ‹κ³Ό ν‘œν˜„μ‹ 문의 차이

➰ 'ν‘œν˜„μ‹' μ΄λž€ μš©μ–΄λŠ” 두 가지 ν˜•νƒœλ‘œ μ‚¬μš©ν•˜λŠ”λ°, 이 λ‘˜μ„ κ΅¬λΆ„ν•˜κ³ μž 'ν‘œν˜„μ‹(expression)'κ³Ό 'ν‘œν˜„μ‹ λ¬Έ(expression statement)'으둜 κ΅¬λΆ„ν•œ 것이닀.

let a = 1, b = 0
if(a > b) console.log('a is greater than b')
const isGreater = (a: numver, b: number): boolean => a > b

➰ 2ν–‰μ˜ a > b μ½”λ“œλŠ” ν‘œν˜„μ‹μœΌλ‘œ, μ‹€ν–‰λ¬Έμ˜ 일뢀일 뿐 κ·Έ μžμ²΄κ°€ 싀행문인 것은 μ•„λ‹ˆλ‹€. (ν‘œν˜„μ‹)

➰ 3ν–‰μ˜ a > b μ½”λ“œλŠ” κ·Έ μžμ²΄κ°€ μ‹€ν–‰λ¬Έ(statement)이닀. (ν‘œν˜„μ‹ λ¬Έ)

 

πŸ“ 싀행문을 λ§Œλ“œλŠ” μ„Έλ―Έμ½œλ‘ 

➰ ESNext μžλ°”μŠ€ν¬λ¦¬λΈ₯와 νƒ€μž…μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” λ¬Έμž₯ 끝에 μ„Έλ―Έμ½œλ‘ (;)을 μƒλž΅ν•  수 μžˆλ‹€.

➰ ν•˜μ§€λ§Œ κ΄€μŠ΅μ μœΌλ‘œ, νƒ€μž…μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” ν‘œν˜„μ‹ λ¬Έμ—λŠ” μ„Έλ―Έμ½œλ‘ μ„ 뢙이지 μ•ŠλŠ”λ‹€.


πŸ“£  일등 ν•¨μˆ˜ μ‚΄νŽ΄λ³΄κΈ°

πŸ“ 콜백 ν•¨μˆ˜

➰ 일등 ν•¨μˆ˜ : λ³€μˆ˜μ— ν• λ‹Ήν•  수 있고, λ‹€λ₯Έ ν•¨μˆ˜μ˜ 인자둜 전달할 수 있으며, λ‹€λ₯Έ ν•¨μˆ˜μ˜ κ²°κ³Ό κ°’μœΌλ‘œ λ°˜ν™˜λ  수 μžˆλŠ” ν•¨μˆ˜

➰ 콜백 ν•¨μˆ˜ : 맀개 λ³€μˆ˜ ν˜•νƒœλ‘œ λ™μž‘ν•˜λŠ” ν•¨μˆ˜

// fλŠ” callback ν•¨μˆ˜λ₯Ό 인자둜 λ°›λŠ” ν•¨μˆ˜, λͺΈν†΅μ—μ„œλŠ” callback ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•œλ‹€.
const f = (callback: () => void): void => callback()

 

πŸ“ 쀑첩 ν•¨μˆ˜

➰ ν•¨μˆ˜ν˜• μ–Έμ–΄μ—μ„œ, ν•¨μˆ˜λŠ” λ³€μˆ˜μ— λ‹΄κΈ΄ ν•¨μˆ˜ ν‘œν˜„μ‹ μ΄λ―€λ‘œ ν•¨μˆ˜ μ•ˆμ— 또 λ‹€λ₯Έ ν•¨μˆ˜λ₯Ό μ€‘μ²©ν•΄μ„œ κ΅¬ν˜„ν•  수 μžˆλ‹€.

const calc = (value: number, cb: (number) => void): void => {
    let add = (a, b) => a + b
    functino multiply(a, b) {return a + b}
    ...
}

 

πŸ“ κ³ μ°¨ ν•¨μˆ˜μ™€ ν΄λ‘œμ €, 그리고 λΆ€λΆ„ ν•¨μˆ˜

➰ κ³ μ°¨ ν•¨μˆ˜ : 또 λ‹€λ₯Έ ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜

const add1 = (a: number. b: number): number => a + b // 보톡 ν•¨μˆ˜
const add2 = (a: nubmer): (number) => number => (b: number): number => a + b // κ³ μ°¨ ν•¨μˆ˜

 

export type NumberToNumberFunc = (number) => number
export const add = (a: number): NumberToNumberFunc => {
    const _add: NumberToNumberFunc = (b: number): number => {
        return a + b //ν΄λ‘œμ €
    }
    return _add
}

➰ aλŠ” addν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜μ΄κ³ , bλŠ” _add ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜λΌμ„œ _add ν•¨μˆ˜μ˜ κ΄€μ μ—μ„œ 보면 aλŠ” 외뢀에 μ„ μ–Έλœ λ³€μˆ˜μ΄λ‹€.

➰ 이와 같은 ν˜•νƒœλ₯Ό 'ν΄λ‘œμ €' 라고 ν•œλ‹€.

 

import {NumberToNumberFunc, add) from './add'

let fn: NumberToNumberFunc = add(1)

let result = fn(2)
let result2 = add(1)(2)

➰ fn은 아직 값이 μ•„λ‹Œ ν•¨μˆ˜μ΄λ©°, 이λ₯Ό 'λΆ€λΆ„ μ• ν”Œλ¦¬μΌ€μ΄μ…˜' λ˜λŠ” 'λΆ€λΆ„ 적용 ν•¨μˆ˜' 라고 λΆ€λ₯Έλ‹€.

➰ fn 같은 μž„μ‹œ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ ν•¨μˆ˜ 호좜 μ—°μ‚°μžλ₯Ό 두 개 μ‚¬μš©ν•΄μ•Όλ§Œ ν•¨μˆ˜κ°€ μ•„λ‹Œ 값을 얻을 수 μžˆλ‹€.


πŸ“£  ν•¨μˆ˜ κ΅¬ν˜„ 기법

πŸ“ λ§€κ°œλ³€μˆ˜ κΈ°λ³Έκ°’ μ§€μ •ν•˜κΈ°

➰ λ””ν΄νŠΈ λ§€κ°œλ³€μˆ˜ : ν•¨μˆ˜ 호좜 μ‹œ 인자λ₯Ό μ „λ‹¬ν•˜μ§€ μ•Šλ”λΌλ„ λ§€κ°œλ³€μˆ˜μ— μ–΄λ–€ 값을 μ„€μ •ν•˜κ³  μ‹Άλ‹€λ©΄ λ§€κ°œλ³€μˆ˜μ˜ 기본값을 지정할 수 μžˆλ‹€.

const makePerson = {name: string, age: number = 10) : Person => {
    ...
}

 

πŸ“ 객체 생성 μ‹œ κ°’ 뢀뢄을 μƒλž΅ν•  수 μžˆλŠ” νƒ€μž…μŠ€ν¬λ¦½νŠΈ ꡬ문

const makePerson = (name: string, age: number) => {
    const person = {name, age}	// {name: name, age: age}의 단좕 ν‘œν˜„
}

 

πŸ“ 객체λ₯Ό λ°˜ν™˜ν•˜λŠ” ν™”μ‚΄ν‘œ ν•¨μˆ˜ λ§Œλ“€κΈ°

export const makePerson = {name: string, age: number = 10): Person => ({name, age})

➰ μ»΄νŒŒμΌλŸ¬κ°€ {}λ₯Ό 볡합 싀행문이 μ•„λ‹Œ 객체둜 ν•΄μ„ν•˜κ²Œ ν•˜λ €λ©΄ 객체λ₯Ό μ†Œκ΄„ν˜Έλ‘œ 감싸주어야 ν•œλ‹€.

 

πŸ“ 색인 킀와 κ°’μœΌλ‘œ 객체 λ§Œλ“€κΈ°

➰ 객체의 속성 이름을 λ³€μˆ˜λ‘œ λ§Œλ“€λ €κ³  ν•  λ•Œ μ‚¬μš©ν•œλ‹€.

const makeObject = (key, value) => ({[key]: value})
makeObject('name', 'Jack');
makeObject('firstName', 'Jane')

➰ {[key]: value} ν˜•νƒœλ₯Ό '색인 κ°€λŠ₯ νƒ€μž…' 이라고 ν•œλ‹€.

type KeyType = {
    [key: string]: string
}

πŸ“£  클래슀 λ©”μ„œλ“œ

πŸ“ function ν•¨μˆ˜μ™€ this ν‚€μ›Œλ“œ

➰ function ν‚€μ›Œλ“œλ‘œ λ§Œλ“  ν•¨μˆ˜λŠ” Functionμ΄λž€ 클래슀의 μΈμŠ€ν„΄μŠ€, 즉 ν•¨μˆ˜λŠ” 객체이닀.

➰ μΈμŠ€ν„΄μŠ€λŠ” this ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆμœΌλ‚˜, ν™”μ‚΄ν‘œ ν•¨μˆ˜μ—λŠ” thisλ₯Ό μ‚¬μš©ν•  수 μ—†λ‹€.

 

πŸ“ λ©”μ„œλ“œλž€?

➰ νƒ€μž…μŠ€ν¬λ¦½νŠΈμ—μ„œ λ©”μ„œλ“œλŠ” function으둜 λ§Œλ“  ν•¨μˆ˜ ν‘œν˜„μ‹μ„ λ‹΄κ³  μžˆλŠ” 속성이닀.

 

πŸ“ 클래슀 λ©”μ„œλ“œ ꡬ문

➰ ν•¨μˆ˜ ν‘œν˜„μ‹μ„ λ‹΄λŠ” 속성은 function ν‚€μ›Œλ“œλ₯Ό μƒλž΅ν•  수 있게 ν•˜λŠ” 단좕 ꡬ문을 μ œκ³΅ν•œλ‹€.

export class B {
    constructor(public value: number = 1) {}
    method(): void {	// function ν‚€μ›Œλ“œλ₯Ό μƒλž΅ν•¨.
        console.log(`value: ${this.value}`)
    }
}

 

πŸ“ 정적 λ©”μ„œλ“œ

➰ 클래슀의 속성은 static μˆ˜μ •μžλ₯Ό 속성 μ•žμ— λΆ™μ—¬μ„œ μ •μ μœΌλ‘œ λ§Œλ“€ 수 μžˆλ‹€.

➰ λ©”μ„œλ“œλ„ μ†μ„±μ΄λ―€λ‘œ 정적 λ©”μ„œλ“œλ‘œ λ§Œλ“€ 수 μžˆλ‹€.

export class C {
    static whoAreYou(): string {
        return `I'm class C`
    }
}

export class D {
    static whoAreYou(): string {
        return `I'm class D`
    }
}

C.whoAreYou() // ν΄λž˜μŠ€μ΄λ¦„.μ •μ λ©”μ„œλ“œ() ν˜•νƒœλ‘œ 호좜
D.whoAreYou()

 

πŸ“ λ©”μ„œλ“œ 체인

➰ λ©”μ„œλ“œ 체인 : 객체의 λ©”μ„œλ“œλ₯Ό μ΄μ–΄μ„œ 계속 ν˜ΈμΆœν•˜λŠ” λ°©μ‹μ˜ μ½”λ“œ

➰ νƒ€μž…μŠ€ν¬λ¦½νŠΈλ‘œ λ©”μ„œλ“œ 체인을 κ΅¬ν˜„ν•˜λ €λ©΄ λ©”μ„œλ“œκ°€ 항상 thisλ₯Ό λ°˜ν™˜ν•˜κ²Œ ν•΄μ•Ό ν•œλ‹€.

export class calculator {
    constructor(public value: number = 0) {}
    add(value: number) {
        this.value += value
        return this
    }
    multiply(value: number) {
        this.value *= value
        return this
    }
}
import {Calculator) from './method-chain'

let calc = new Calculator
let result = calc.add(1).add(2).multiply(4).multiply(4).value
console.log(result) // (0 + 1 + 2) * 3 * 4 = 36