FE develop/Typescript

📘 TypeScript - 함수

hoj0806 2025. 5. 23. 16:18

TypeScript에서 함수는 자바스크립트처럼 동작하지만, 정적 타입 덕분에 더 안전하고 명확하게 정의할 수 있습니다. 이번 글에서는 함수 정의, 옵셔널 파라미터, 나머지 매개변수, this 타입, 오버로드 등 TypeScript 함수 문법의 핵심을 정리합니다.

 

 

✅ 함수 타입 정의

함수의 매개변수반환값의 타입을 명시할 수 있습니다.

function add(num1: number, num2: number): number {
  return num1 + num2;
}

 

반환값이 없는 함수는 void 타입을 사용합니다.

 

function printHello(): void {
  console.log('Hello');
}

 

❓ 옵셔널 파라미터 (Optional Parameter)

 

파라미터에 ?를 붙이면 선택적으로 받을 수 있습니다.

function hello(name?: string): string {
  return `Hello, ${name || 'World'}`;
}

hello();       // "Hello, World"
hello("Sam");  // "Hello, Sam"

⚠️ 옵셔널 파라미터는 항상 가장 뒤에 와야 합니다.

 

 

기본값을 지정하는 방법도 있습니다.

function hello2(name = 'World'): string {
  return `Hello, ${name}`;
}

 

📦 나머지 매개변수 (Rest Parameters)

 

여러 개의 값을 하나의 배열로 받을 수 있습니다.

function add(...nums: number[]): number {
  return nums.reduce((total, num) => total + num, 0);
}

add(1, 2, 3, 4); // 10

 

👤 this 타입 지정

 

함수에서 this의 타입도 명시할 수 있습니다. 첫 번째 매개변수 자리에 this 타입을 선언하면 됩니다.

interface User {
  name: string;
}

const Sam: User = { name: 'Sam' };

function showName(this: User, age: number, gender: 'm' | 'f') {
  console.log(this.name, age, gender);
}

const bound = showName.bind(Sam);
bound(30, 'm'); // Sam 30 m

일반 함수와는 달리, 화살표 함수는 this를 바인딩하지 않습니다.

 

🔁 반환 타입 조건 분기

 

조건에 따라 서로 다른 타입을 반환할 수 있지만, 이럴 경우 TypeScript가 정확한 반환 타입을 추론하지 못할 수 있습니다.

interface User {
  name: string;
  age: number;
}

function join(name: string, age: number | string): User | string {
  if (typeof age === 'number') {
    return { name, age };
  } else {
    return "나이는 숫자로 입력해주세요";
  }
}

 

이 경우, 호출부에서 타입을 정확히 분기 처리하거나 함수 오버로드를 사용하는 것이 좋습니다.

 

 

🎯 함수 오버로드 (Function Overload)

같은 이름의 함수지만 매개변수의 타입/갯수에 따라 다르게 동작하게 할 수 있습니다.

interface User {
  name: string;
  age: number;
}

// 오버로드 시그니처
function join(name: string, age: string): string;
function join(name: string, age: number): User;

// 실제 구현
function join(name: string, age: number | string): User | string {
  if (typeof age === 'number') {
    return { name, age };
  } else {
    return "나이는 숫자로 입력해주세요";
  }
}

const sam: User = join('Sam', 30);
const jane: string = join('Sam', '25');