TypeScript의 함수 오버로딩에 대한 빠른 가이드
13814 단어 tutorialwebdevtypescriptbeginners
기본 함수의 경우 이 작업을 수행하기가 매우 쉽지만 함수가 다양한 인수 개수 및 유형을 사용하거나 호출 방식에 따라 다른 유형을 반환하는 경우에는 어떻게 해야 할까요?
이러한 경우 TypeScript에는 편리한function overloading 기능이 있습니다. 이를 사용하는 방법과 코드를 개선하는 데 어떻게 도움이 되는지 살펴보겠습니다.
함수 타이핑
지금 배가 고파서 음식을 요리하는 함수를 만들어 봅시다.
function cookDish(ingredient: string): string {
return `${ingredient}🍴 is ready, bon appétit!`;
}
단일
string
인수를 재료로 전달했으며 호출 후 string
요리를 반환합니다.cookDish('🥚'); // '🍳🍴 is ready, bon appétit!'
하지만 잠깐, 이것으로는 충분하지 않습니다. 여기에 샌드위치가 꼭 필요합니다!
요리하려면 여러 재료를 사용할 수 있도록 함수를 수정해야 합니다.
function cookDish(ingredient: string | string[]): string {
const tableSet = '🍴 is ready, bon appétit!';
if (typeof ingredient === 'string') {
return `${ingredient}${tableSet}`;
} else if (Array.isArray(ingredient)) {
return `${ingredient.join('')}${tableSet}`
}
throw new Error('Nothing to cook 😭');
}
함수 인수를 설명하기 위해
Union
유형을 사용했습니다. 이는 하나string
또는 여러 개string[]
일 수 있습니다.cookDish('🌽'); // '🍿🍴 is ready, bon appétit!';
cookDish(['🍞', '🍅', '🥓']); // '🥪🍴 is ready, bon appétit!';
다양한 인수를 지원하기 위해 유형을 추가하는 것은 대부분의 경우 일반적이고 좋은 접근 방식이지만 때로는 함수를 호출하는 모든 방법을 명시적으로 정의해야 합니다. 이것은 함수 오버로딩이 작용하는 곳입니다.
함수 오버로딩
다소 복잡한 함수의 경우 사용성 및 가독성을 향상시키기 위해 항상 함수 오버로딩 기능을 사용하여 사용성 및 가독성을 향상시키는 것이 좋습니다. 이 접근 방식은 가장 유연하고 투명한 것으로 간주됩니다.
이를 사용하려면 몇 가지 함수 서명을 작성해야 합니다.
오버로드 서명 - 함수를 호출하는 다양한 방법(인수 및 반환 유형)을 정의하며 본문이 없습니다. 여러 오버로드 서명(일반적으로 2개 이상)이 있을 수 있습니다.
구현 서명 - 함수에 대한 구현을 제공합니다: 함수 본문. 구현 서명은 하나만 있을 수 있으며 오버로드 서명과 호환되어야 합니다.
함수 오버로딩을 사용하여
cookDish
를 다시 작성해 보겠습니다.// Overload signature
function cookDish(ingredient: string): string
function cookDish(ingredients: string[]): string
// Implementation signature
function cookDish(ingredient: any): string {
const tableSet = '🍴 is ready, bon appétit!';
if (typeof ingredient === 'string') {
return `${ingredient}${tableSet}`;
} else if (Array.isArray(ingredient)) {
return `${ingredient.join('')}${tableSet}`
}
throw new Error('Nothing to cook 😭');
}
두 개의 오버로드 서명은
string
또는 string[]
인수를 사용하여 함수를 호출할 수 있는 두 가지 방법을 설명합니다. 두 가지 방법 모두 결과적으로 요리된string
요리를 얻게 됩니다.구현 서명은 함수 본문 내에서 함수의 동작을 정의합니다.
함수 호출은 변경되지 않지만 이전과 같이 요리할 수 있습니다.
cookDish('🍚'); // '🍙🍴 is ready, bon appétit!';
cookDish(['🫓', '🍅', '🥑']); // '🥙🍴 is ready, bon appétit!';
const money: any = 100;
cookDish(money);
/**
⛔ No overload matches this call.
Overload 1 of 2, '(ingredient: string): string', gave the following error.
Argument of type 'any' is not assignable to parameter of type 'string'.
Overload 2 of 2, '(ingredients: string[]): string', gave the following error.
Argument of type 'any' is not assignable to parameter of type 'string[]'.
*/
위의 마지막 예에서 참고하세요: 구현 서명이 우리의 기능을 구현하는 것이지만 돈은 요리를 할 수 없습니다.
any
를 인수function cookDish(ingredient: any)
로 받아들이더라도 직접 호출할 수 없습니다. 오버로드 서명만 호출할 수 있습니다.저녁 식사 시간입니다! 약간 더 복잡한 예를 살펴보겠습니다.
function cookDinner(dish: string): string
function cookDinner(money: number): string // Wrong argument type
/**
⛔ This overload signature is not compatible with its implementation signature.
*/
function cookDinner(dish: string, drink: string, dessert: string): string
function cookDinner(dish: string, drink?: string, dessert?: string): string {
let dinner = `${dish}🍴`
if (drink && dessert) {
dinner += ` ${drink}🧊${dessert}🥄`
}
return `${dinner} is ready, bon appétit!`
}
cookDinner('🍝'); // '🍝🍴 is ready, bon appétit!';
cookDinner('🍔', '🥤', '🍰'); // '🍔🍴🥤🧊🍰🥄 is ready, bon appétit!';
cookDinner('🍺', '🍸') // 🤒 Invalid number of arguments
/**
⛔ No overload expects 2 arguments, but overloads do exist that expect either 1 or 3 arguments.
*/
구현 서명은 오버로드와 호환되어야 하며 직접 호출할 수 없음을 기억해야 합니다.
결론
함수 오버로딩은 함수를 보다 우아하게 입력할 수 있는 강력한 TypeScript 기능입니다.
더 읽기:
이 가이드를 즐기셨기를 바라며 계속 지켜봐 주시기 바랍니다.
Reference
이 문제에 관하여(TypeScript의 함수 오버로딩에 대한 빠른 가이드), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/murashow/quick-guide-to-function-overloading-in-typescript-2178텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)