Search

함수 Overloading & 다형성

대분류
언어
소분류
TypeScript
유형
Overloading
Polymorphism
최종 편집 일시
2024/10/30 02:19
생성 일시
2023/10/30 06:06
15 more properties

Overloading

함수의 오버로딩 : 동일한 이름에 매개 변수만 다른 여러 버전의 함수를 만드는 것
파라미터의 형태가 다양한 여러 케이스에 대응하는 같은 이름을 가진 함수를 만드는 것
함수의 다형성(다양한 형태)을 지원하는 것
function 키워드로만 함수 오버로딩을 할 수 있으며 arrow function으로는 오버로딩 불가

나쁜 예시

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; }
TypeScript
복사

실제 사용

type Config = { path: string, state: object } type Push = { (path: string): void; (config: Config): void } const push: Push = (config) => { if(typeof config === "string") { console.log(config); } else { console.log(config.path); } }
TypeScript
복사

파라미터 개수가 다른 경우

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; } add(1,2); add(1,2,3);
TypeScript
복사
오버로딩은 직접 작성보다는 외부 라이브러리 자주 보이는 형태

Polymorphism(다형성) / Generic

여러가지 구조물
Generic → placeholder

Call Signatures

// 기존 방식, 좋지 않음 type SuperPrint = { (arr: number[]): void; (arr: boolean[]): void; (arr: string[]): void; (arr: (number|boolean)[]): void; } const superPrint: SuperPrint = (arr) => { arr.forEach(i => console.log(i)) } superPrint([1, 2, 3, 4]); superPrint([true, false, true]); superPrint(["a", "b", "c"]); superPrint([1, 2, true, false])
TypeScript
복사
// generic 사용 type SuperPrint = { < TypePlaceholder >(arr: TypePlaceholder[]): TypePlaceholdersa; //TypePlaceholder 말고 다른거 사용 가능, T, V 많이 상용 } const superPrint: SuperPrint = (arr) => arr[0]; superPrint([1, 2, 3, 4]); superPrint([true, false, true]); superPrint(["a", "b", "c"]); superPrint([1, 2, true, false])
TypeScript
복사
//제네릭 매개변수 여러개 type SuperPrint = { <T, M>(a: T[], b: M): T; } const superPrint: SuperPrint = (arr) => arr[0]; const a = superPrint([1, 2, 3, 4], "x"); const b = superPrint([true, false, true], 1); const c = superPrint(["a", "b", "c"], false); const d = superPrint([1, 2, true, false])
TypeScript
복사

함수

function superPrint<V>(a: V[]) { return a[0]; } const a = superPrint<number>([1, 2, 3, 4]); // 비추 const b = superPrint([true, false, true]); const c = superPrint(["a", "b", "c"]); const d = superPrint([1, 2, true, false])
TypeScript
복사

객체

type Player<E> = { name: String; extraInfo: E; } type NicoExtra = { favFood: string; } const nico: Player<NicoExtra> = { name: "nico", extraInfo: { favFood: "kimchi"; } } const lynn: Player<null> = { name: "lynn", extraInfo: null }
TypeScript
복사