TS
TS 03 overloading, Polymorphism, generic
와라리요
2023. 1. 31. 11:00
overloading
- 서로 다른 여러 개의 call dignature를 가지고 있는 것을 overloading이다. 직접 사용하는 것은 드물고 라이브러리, 프레임워크를 만들 때 대부분 사용이 된다.
type Add = {
(a: number, b: number): number
(a: number, b: string): number
}
const add: Add = (a, b) => {
if (typeof b === "string") return a
return a + b;
}
파아미터의 개수가 다를 때 인자 선언하기
- 여러가지 상황을 고려하여 파라미터들을 구성해 추가적으로 +된 overloading이 있다면 오류가 발행하는 상황이 있다. 그럴때는 인자에 ?와 타입을 선언하면 된다.
type Add () = {
(a: number, b: number): number
(a: number, b: number, c:number): number
}
const add: Add = (a, b, c?: number) => [
if (c) return a + b + c;
return a + b;
}
Polymorphism (다형성)
generic
- 타입을 미리 정하는 것이 아닌 인자로 받는 값에 맞게 타입을 자동으로 지정해 준다. 타입이 없는 것이 아닌 각 인자마다의 타입을 자동으로 선언해 주는 것이다!!
사용하는 방법은 인자로 받을 타입 앞에 <>로 generic를 선언할 것을 알려주고 <> 안에 단어를 넣는다. 그 후 메소드 뒤에 단어를 선언해주면 된다.
function print<T>(a: T) {
return a;
}
// 다양한 타입을 자동으로 선언한다.
print([1, 2, 3]);
print(['a', 'b', 'c']);
print([1, 'a', 2, 'b']);
//overloading을 함께 적용하면
//리턴 값이 없을 때
type Print = {
<T>(arr: holder[]): void
}
const print: T = (arr) => {
arr.forEach(e => console.log(e));
}
// 전부 정상 작동이 되며 각 타입에 맞게 선언이 되어 있음.
print([1, 2, 3]);
print(['a', 'b', 'c']);
print([1, 'a', 2, 'b']);
//리턴 값이 있을 때
type Print = {
<T>(arr: holder[]): T
}
const print: T = (arr) => arr[0];