프로그래밍TypeScript 개발자

TypeScript에서 함수 오버로드의 타입화는 어떻게 작동하며, 다른 언어의 메소드 오버로드와 어떤 차이가 있나요?

Hintsage AI 어시스턴트로 면접 통과

답변.

질문의 역사

Java나 C#과 같은 언어에서는 함수와 메소드 오버로드가 표준 기능입니다. 동일한 이름의 여러 함수를 선언할 수 있지만 각기 다른 매개변수를 가집니다. JavaScript에는 이러한 기능이 없어 잠재적인 오류가 발생할 수 있습니다. TypeScript는 유형 수준에서 이 문제를 해결합니다.

문제

TypeScript에는 진정한 오버로드(다중 구현)가 없습니다. 동일한 함수의 여러 서명을 선언할 수 있지만 단 하나의 함수만 구현할 수 있습니다. 선언된 서명과 구현 간의 불일치 또는 서명 간의 잘못된 정렬로 인해 오류가 발생할 수 있습니다.

해결책

TypeScript는 여러 서명을 연속적으로 선언하고 모든 오버로드 변형과 호환되는 단일 진정한 구현을 통해 함수 오버로드를 지원합니다.

코드 예시:

function sum(a: number, b: number): number; function sum(a: string, b: string): string; function sum(a: any, b: any): any { return a + b; } const a = sum(1, 2); // 3 const b = sum('foo', 'bar'); // "foobar"

주요 특징:

  • 모든 서명 뒤에 항상 하나의 구현이 있어야 함
  • 구현은 모든 오버로드 변형과 호환되어야 함
  • TypeScript는 오버로드된 함수 사용 시 호출의 정확성을 검증함

함정 질문들.

오버로드 서명 선언 전에 함수 구현을 정의할 수 있습니까?

아니요, 먼저 모든 오버로드 서명이 있어야 하고 그다음 구현이 와야 합니다. 오류:

// 오류! 먼저 서명, 그 다음 구현 function foo(a: number): number { return a } // 오류 function foo(a: string): string { return a } // 오류

TypeScript는 모든 오버로드 서명의 반환 값을 검증합니까?

TypeScript는 컴파일 단계에서 선언된 서명에 따라 반환 유형을 보장하지만, 실행 중에는 어떤 유형 검증도 발생하지 않습니다.

단일 구현에서 모든 입력 데이터 변형을 처리해야 합니까?

구현 함수는 오버로드 서명에 따라 모든 입력 데이터 변형을 올바르게 처리해야 합니다:

function parse(a: number): string; function parse(a: string): string; function parse(a: number | string): string { return String(a); }

일반적인 오류와 안티 패턴

  • 구현과 오버로드 서명의 불일치
  • 서명과 구현의 잘못된 순서
  • 유형 조합의 암묵적 처리/무시

현실 예시

부정적인 케이스

다양한 вход 타입으로 함수의 여러 오버로드가 선언되었지만, 구현은 모든 경우를 처리하지 않고 드문 입력 시 런타임 오류를 발생시킵니다.

장점:

  • 함수 사용자에게 유연한 API 제공

단점:

  • 유형은 컴파일되지만 함수가 추가적인 검사가 없으면 제대로 작동하지 않음

긍정적인 케이스

각 오버로드 함수는 구현 내에서 유형 조건을 충족하는지 확인하며, 타입 검사를 사용합니다 (typeof/instanceof).

장점:

  • 안전하고 예측 가능한 API
  • 오류는 컴파일 단계에서 포착됨

단점:

  • 추가적인 검증으로 코드베이스가 증가함