본문 바로가기

FrontEnd

Ad hoc polymophism(애드훅 다형성) with typescript

반응형

more type!

다형성의 종류(더있긴 하지만 주로 만나는것)

서브타입 다형성 : 상속,구현

  • (할당 가능) 타입명이 공통 슈퍼클래스/인터페이스를 상속/구현한 인스턴스들을 의미.
    • 구현은 각각
  • 파라미터 다형성 : 제네릭 (타입 파라미터 이용 다형성)
    • (파라미터) 타입명이 모든 타입을 나타낼 수 있음을 의미.
    • 구현은 하나
  • 애드훅 다형성 : 메소드 / 함수 오버로딩 (타입 클래스)
    • 구현은 각각

타입스크립트를 쓰는 이유

자바스크립트로 객체 지향 하기 위해서?

핵심이 인터페이스인 이유?

자바스크립트 💔 OOP

리액트 hooks가 나온 이유?

OOP보다는 es3로 돌아간 듯한 느낌을 주는 이유?

So, Why OOP?

interface통해 사용하는 곳을 바꾸지 않고 기능을 추가할 수 있음.

사용하는 곳의 if를 없앤다. 자바에서는 서브타입 다형성을 주로 사용.

(팩토리 메서드로 다형성 구현 - 자바가 간만이라 문법이 맞는지 모르겠음)

// location of use (without if)
SomeInterface someInstance = SomeClassFactory.getClass('1');

// implementation point
static class SomeClassFactory{

	SomeInterface getClass(int flag){
    
    	if(flag===1){
        	// this implements 
        	return oneClass();
        }
        if(flag===2){
        	// this implements 
        	return twoClass();
        }
        
        // ... we can always add more if return class implements "SomeInterface".
    
    }

}

함수형 프로그래밍 with typescript

추상화된 선언적인 함수를 제공해야 하는데... 오버로딩이 안되면 곤란한데...

구체적이거나, 타입체킹 로직이 지저분해지거나...

Ad-hoc polymophism

자바에서는 메소드 오버로딩이 된다 (nominal typing). 이름만 같지 다른 함수다.

파이썬이나 자바스크립트는 마지막 함수 선언만 유효하다.

함수를 하나만 만들고 instanceof typeof 같은 키워드를 이용하여 구현한다.

결국엔 큰거 하나 만들어야 한다.

실제 구현은 단 하나만 허용한다는 것을 잊지 말자.

export function serialize(x:RGB):string
export function serialize(x:HSL):string

export const selializeColor=(x:RGB|HSL|'transparent'):string=>{
  if(isRGB(x)) return serializeRGB(x);
  if(isHSL(x)) return serializeHSL(x);
  // ...
}

위는 리듀서나 팩터리 메서드에서 자주 보이는 예시이다.

// 즉, 함수, 메서드 오버로딩이 안된다고...
function serialize(x:RGB){
  return serializeRGB(x);
}

function serialize(x:HSL){
  return serializeHSL(x);
}

우회로 : tagged-union(sum type)을 사용한다

타입 선언 / 팩토리 함수 선언

같은 인터페이스로 호출

그래서 무엇이 달라졌나요?

  1. interface / 팩토리 함수에 로직이 응집된다.
  2. type guard가 사라졌다.
  3. switch가 사라졌다.

 

여담 : 

리듀서는 각 타입에 대한 대응을 하나의 함수에서 한다.

위는 각 타입에 대한 대응을 타입 프로퍼티 내의 함수(메서드)로 처리한다.

 

 

참고 자료

Inheritance vs Generics vs TypeClasses in Scala - DEV Community

 

Inheritance vs Generics vs TypeClasses in Scala

How do the 3 types of polymorphism actually work in Scala?

dev.to

Polymorphism in Typescript. FP and OOP teaming up to fight code… | by Hugo Nteifeh | Level Up Coding (gitconnected.com)

 

Polymorphism in Typescript

FP and OOP teaming up to fight code redundancy

levelup.gitconnected.com

Functional design: Algebraic Data Types - DEV Community

 

Functional design: Algebraic Data Types

A good first step while building a new application is to define its domain model. TypeScript offers m...

dev.to

 

반응형