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"
주요 특징:
오버로드 서명 선언 전에 함수 구현을 정의할 수 있습니까?
아니요, 먼저 모든 오버로드 서명이 있어야 하고 그다음 구현이 와야 합니다. 오류:
// 오류! 먼저 서명, 그 다음 구현 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); }
다양한 вход 타입으로 함수의 여러 오버로드가 선언되었지만, 구현은 모든 경우를 처리하지 않고 드문 입력 시 런타임 오류를 발생시킵니다.
장점:
단점:
각 오버로드 함수는 구현 내에서 유형 조건을 충족하는지 확인하며, 타입 검사를 사용합니다 (typeof/instanceof).
장점:
단점: