반응형
함수 오버로딩
오버로딩이란 하나의 함수의 매개변수의 개수나 타입에 따라 다르게 동작하도록 만드는 문법
/**
* 함수 오버로딩
* 같은 함수를 매개변수의 개수나 타입에 따라
* 여러가지 버전으로 만드는 문법
* -> 하나의 함수 func
* -> 일단 모든 매개변수는 넘버타입
* -> Ver1. 매개변수가 1개일 때에는 매개변수에 20을 곱한 값을 출력
* -> Ver2. 매개변수가 3개일 때에는 모든 매개변수를 더한 값을 출력
*/
타입스크립트에서 함수 오버로딩을 구현하려면 먼저 다음과 같이 버전별 오버로드 시그니쳐를 만들어 줘야 한다.
// 버전들 -> 오버로드 시그니쳐
function func(a: number): void;
function func(a: number, b: number, c: number): void;
- 이렇게 구현부 없이 선언부만 만들어둔 함수를 ‘오버로드 시그니쳐’라고 한다.
- 위 코드에서는 2개의 오버로드 시그니쳐를 만들었으며 각각 함수의 버전을 의미한다.
- 위 코드는 func 함수는 매개변수를 1개 받는 버전과 3개 받는 2개의 버전이 있다고 알리는 것 과 같다.
- 오버로드 시그니쳐를 만들었다면 다음으로는 구현 시그니쳐를 만들어줘야 한다.
- 구현 시그니쳐는 실제로 함수가 어떻게 실행될 것인지를 정의하는 부분이다.
// 버전들 -> 오버로드 시그니쳐
function func(a: number): void;
function func(a: number, b: number, c: number): void;
// 실제 구현부 -> 구현 시그니쳐
function func(a: number, b?: number, c?: number) {
if (typeof b === "number" && typeof c === "number") {
console.log(a + b + c);
} else {
console.log(a * 20);
}
}
func(1); // ✅ 버전 1 - 오버로드 시그니쳐
func(1, 2); // ❌
func(1, 2, 3); // ✅ 버전 3 - 오버로드 시그니쳐
- 구현 시그니쳐의 매개변수 타입은 모든 오버로드 시그니쳐와 호환되도록 만들어야 한다.
사용자 정의 타입 가드
사용자 정의 타입가드란 참 또는 거짓을 반환하는 함수를 이용해 우리 입맛대로 타입 가드를 만들 수 있도록 도와주는
타입스크립트의 문법이다.
type Dog = {
name: string;
isBark: boolean;
};
type Cat = {
name: string;
isScratch: boolean;
};
type Animal = Dog | Cat;
function warning(animal: Animal) {
if ("isBark" in animal) {
console.log(animal.isBark ? "짖습니다" : "안짖어요");
} else if ("isScratch" in animal) {
console.log(animal.isScratch ? "할큅니다" : "안할퀴어요");
}
}
- 2개의 타입 Dog와 Cat을 정의하고 두 타입의 유니온 타입인 Animal 타입을 정의
- 다음으로 매개변수로 Animal 타입의 값을 받아 동물에 따라 각각 다른 경고를 콘솔에 출력하는 함수 warning을 만듦
- 만약 이 함수를 호출하고 인수로 Dog 타입의 객체를 전달하면 “짖습니다” 또는 “안짖어요”를 출력할 것이고
Cat 타입의 객체를 전달하면 “할큅니다” 또는 “안 할퀴어요”를 출력할 것 입니다.
그런데 이렇게 in 연산자를 이용해 타입을 좁히는 방식은 좋지 않다고 한 적 있다.
예를 들어 만약 Dog 타입의 프로퍼티가 다음과 같이 중간에 이름이 수정되거나 추가 또는 삭제될 경우에는
타입 가드가 제대로 동작하지 않을 수도 있다.
type Dog = {
name: string;
isBarked: boolean; // isBark -> isBarked
};
따라서 이럴 때에는 다음과 같이 함수를 이용해 커스텀 타입 가드를 만들어 타입을 좁히는게 더 좋다.
(...)
// Dog 타입인지 확인하는 타입 가드
function isDog(animal: Animal): animal is Dog {
return (animal as Dog).isBark !== undefined;
}
// Cat 타입인지 확인하는 타입가드
function isCat(animal: Animal): animal is Cat {
return (animal as Cat).isScratch !== undefined;
}
function warning(animal: Animal) {
if (isDog(animal)) {
console.log(animal.isBark ? "짖습니다" : "안짖어요");
} else {
console.log(animal.isScratch ? "할큅니다" : "안할퀴어요");
}
}
반응형
'Typescript' 카테고리의 다른 글
Typescript | 클래스, 접근 제어자, 인터페이스와 클래스 (1) | 2024.11.02 |
---|---|
Typescript | 인터페이스, 확장, 선언 합치기 (0) | 2024.11.02 |
Typescript | 함수 타입, 함수 타입 표현식과 호출 시그니처, 호환성 (0) | 2024.11.02 |
Typescript | 타입 추론, 타입 단언, 타입 좁히기, 서로소 유니온 타입 (0) | 2024.10.29 |
Typescript | 타입 호환성, 대수타입 (2) | 2024.10.29 |