고급 TypeScript 연습 - 답변 10

커스텀 Merge 타입 레벨 기능으로 어떻게 다른 & 조작을 하는지 물어봤습니다.

Note - if you don't recall what means - type level function please take a moment for reading - .



솔루션 1 - 매핑된 유형




type Merge<A, B> = {
    [K in keyof A | keyof B]: 
        K extends keyof B ? B[K] : 
        K extends keyof A ? A[K] : never
}


여기서 우리가 하고 있는 것은 mapped type 인 Merge 함수를 생성하는 것입니다. 매핑된 유형을 사용하면 한 유형을 반복하고 다른 유형으로 매핑할 수 있습니다.
  • [K in keyof A | keyof B] - A 및 B 유형의 키 합집합을 반복합니다. 합집합은 두 유형 모두에서 반복되는 키를 제거하므로 두 번 반복할 필요가 없습니다
  • .
  • K extends keyof B ? B[K] : K extends keyof A ? A[K] : never - 현재 키가 유형 B의 키에 속하는지 확인하기 위해 conditional type을 사용하고, 그렇지 않은 경우 유형 A에 속하는지 확인하고, 이들 중 어느 것에도 속하지 않으면 불가능한 것을 확인합니다. never 로 대체합니다.

  • Note pay attention that we check firstly B type, so if the key is in B, we take value from B, it means we will overwrite eventual value from type A. Don't worry though, that was the requirement of the task.

    Note I said that there is no possibility that key will not be either in A or B, because we iterate over keyof A | keyof B, so there is no option that key will not belong to any of them.



    솔루션 2 - 생략 사용




    type Merge<A, B> = Omit<A, keyof B> & B; 
    


    예, 그것이 전체 솔루션입니다 😉. TypeScript 유형 수준 표준 라이브러리는 솔루션 1에서 했던 것처럼 실제로 매핑된 유형인 Omit과 같은 함수를 제공합니다. 그렇다면 사용할 준비가 된 함수가 있다면 사용하지 않는 이유는 무엇입니까?
  • Omit<A, keyof B> B에 없는 A의 키만 포함하는 유형을 만듭니다
  • .
  • Omit<A, keyof B> & B - A에서 제거된 B의 키로 B와 교차가 없는 이미 생성된 유형에 B 유형을 병합합니다.

  • 결과적으로 우리는 이전 솔루션과 동일한 작업을 수행했지만 한 줄의 코드로 수행했습니다.

    에 대한 훌륭한 답변에 대해 , 및 기타 사용자에게 특별한 감사를 드립니다. 두 솔루션in the playground을 모두 찾을 수 있습니다.

    이 시리즈는 계속됩니다. 고급 TypeScript의 새롭고 흥미로운 질문에 대해 알고 싶다면 및 에서 저를 팔로우하십시오.

    좋은 웹페이지 즐겨찾기