Skip to content

함수 타입 (Function Types)

TypeScript에서는 함수의 매개변수(Parameter)반환값(Return value)에 타입을 지정할 수 있다. 이를 통해 잘못된 인자 전달이나 예상치 못한 반환 타입을 방지하며, 함수 시그니처 자체가 문서 역할을 한다.

ts
function add(x: number, y: number): number {
  return x + y;
}

function sayHi(name: string, greeting: string = "Hi"): string {
  return `${greeting}, ${name}`;
}

1. Parameter 타입

함수에 전달되는 매개변수의 타입을 지정하면 개수와 타입 모두 검사된다.

ts
// 예제1
function add(x: number, y: number): number {
  return x + y;
}

add(10, 5);
add(10); // 오류: 인자 부족
add(10, 5, 20); // 오류: 인자 초과

ts
// 예제2
function addToCart(name: string, price: number, quantity: number) {
  return `${name}, ${price}, ${quantity}`;
}

addToCart("pineapple", 100, 2);
addToCart("apple", 100); // 오류
addToCart("grape", 10, 10, false); // 오류

1-1. 기본값 설정 (Default Parameter)

기본값을 지정하면 인자가 생략될 경우 해당 값이 사용된다.

ts
function addToCart(name: string, price: number, quantity: number = 1) {
  return `${name}, ${price}, ${quantity}`;
}

addToCart("orange", 100); // orange, 100, 1
addToCart("cherry", 100, 3); // cherry, 100, 3

1-2. 선택적 매개변수 (Optional Parameter)

매개변수가 필수가 아닐 때 ?를 붙인다.

ts
function addToCart(name: string, price: number, quantity?: number) {
  return `${name}, ${price}, ${quantity}`;
}

addToCart("orange", 1000); // orange, 1000
addToCart("banana", 2000, 2); // banana, 2000, 2

로직 처리 예제

ts
// Optional parameter + if문
function addToCart(name: string, price: number, quantity?: number) {
  if (quantity) {
    // Logic 추가
  }
  return `${name}, ${price}, ${quantity}`;
}

// Optional parameter + || 연산자
// quantity가 0, undefined, null 등 falsy 값일 경우 1 사용
function addToCart(name: string, price: number, quantity?: number) {
  return `${name}, ${price}, ${quantity || 1}`;
}

addToCart("apple", 1000, 0); // apple, 1000, 1 (0도 falsy로 처리됨)

// Optional parameter + ?? 연산자
// quantity가 undefined 또는 null일 경우에만 기본값 사용
function addToCart(name: string, price: number, quantity?: number) {
  return `${name}, ${price}, ${quantity ?? 1}`;
}

addToCart("apple", 1000, 0); // apple, 1000, 0 (0은 허용됨)
addToCart("banana", 2000); // banana, 2000, 1

2. 컨텍스트 타입 (Contextual Typing)

함수 표현식에서 맥락에 따라 매개변수 타입이 자동 추론된다. 특히 콜백 함수에서 유용하다.

ts
const numbers: number[] = [1, 2, 3, 4, 5];
const letters: string[] = ["a", "b", "c", "d"];

numbers.map((element) => element.toFixed()); // element: number
letters.forEach((letter) => letter.toUpperCase()); // letter: string

3. Return 타입

함수가 반환하는 값의 타입을 명시하면 코드 가독성과 안정성이 높아진다.

3-1. 함수 선언문

ts
function add(x: number, y: number): number {
  return x + y;
}

ts
// string
function addTwoValues(x: number, y: number): string {
  return `${x}${y}`;
}

// number
function addTwoValues(x: number, y: number): number {
  return x + y;
}

// boolean
function isTen(x: number, y: number): boolean {
  return x + y === 10;
}

3-2. 화살표 함수

ts
const add = (x: number, y: number): number => {
  return x + y;
};

ts
// string
const addTwoValues = (x: number, y: number): string => {
  return `${x}${y}`;
};

// number
const addTwoValues = (x: number, y: number): number => {
  return x + y;
};

// boolean
const isTen = (x: number, y: number): boolean => {
  return x + y === 10;
};

4. 특수 반환 타입

4-1. void

값을 반환하지 않는 함수.

ts
function logMessage(message: string): void {
  console.log(message);
}

4-2. never

절대 정상적으로 반환하지 않는 함수. (ex. 무한 루프, 오류 발생)

ts
function throwError(message: string): never {
  throw new Error(message);
}