JavaScript Function == 일급 객체
: 함수를 변수에 할당
: 함수를 다른 함수로 전달
: 함수에서 함수를 반환
: 객체와 프로토타입에 할당
등 객체를 다루듯이 작업 가능
함수 선언문
function 함수이름(매개변수1: 타입1, 매개변수2: 타입2[, ...]): 반환값 타입 {
함수 몸통
}
const 함수이름 = function(매개변수1: 타입1, 매개변수2: 타입2[, ...]): 반환값 타입 {
함수 몸통
}
const 함수이름 = (매개변수1: 타입1, 매개변수2: 타입2[, ...]): 반환값 타입 => 함수 몸통
✅ 변수와 달리 함수의 매개변수 타입과 반환 타입을 생략하는 것은 좋지 않음
(∵ 타입이 생략되어 있으면 함수의 구현의도를 알기 어렵고 잘못 사용하기 쉬움)
(매개변수1 타입, 매개변수2 타입[, ...]) => 반환값 타입
ex) 함수 선언문 & 함수 시그니처 사용
let 함수이름: (매개변수1 타입, 매개변수2 타입) => 반환값 타입
= function (매개변수1: 타입1, 매개변수2: 타입2): 반환값 타입 {
함수 몸통
}
type CreateElement = {
(tag: 'a'): HTMLAnchorElement
(tag: 'canvas'): HTMLCanvasElement
(tag: 'table'): HTMLTableElement
(tag: string): HTMLElement
}
// 함수 구현
// 오버로드 시그니처를 모두 포함할 수 있도록 구현해야함
let createElement: CreateElement = (tag: string): HTMLElement => {
...
}
✅ undefined 타입은 타입스크립트의 타입 계층도에서 모든 타입 중 최하위 타입 => 오류 방지를 위해 매개변수 값이 undefined인지 판별하는 코드를 작성해야함
선택적 매개변수
: 이름 뒤에 '?'를 붙여 선택적으로 호출할 수 있도록 함
: 항상 값이 undefined로 고정
ex) 선택적 매개변수가 있는 함수의 시그니처
type OptionalArgFunc = (string, number?) => void
(매개변수: 타입 = 매개변수 기본값)
function fancyData(this: Date) {
return `${this.getDate()} / ${this.getMonth()} / ${this.getFullYear()}`
}
console.log(fancyData(new Date())) // Expected 0 arguments, but got 1.
console.log(fancyData.call(new Date())) // 19 / 5 / 2022