타입 챌린지 29650 - ExtractToObject

소파의 벨로그·2025년 6월 3일

타입챌린지

목록 보기
103/131

문제 링크

문제

인터페이스에서 prop 값을 추출하는 타입을 구현하라.
그 타입은 두 인자를 받는다.
반환 값은 prop 값과 함께 있는 객체이다.

Implement a type that extract prop value to the interface. The type takes the two arguments. The output should be an object with the prop values.

내 풀이

type ExtractToObject<T, U extends keyof T> =
  {
    [R in keyof T|keyof T[U] as R extends U?never:R]:
      (R extends Exclude<keyof T,U>?T[R]:never)
      |(R extends keyof T[U]?T[U][R]:never)
  }

참고로, T[U]의 키와 T의 키가 겹치는 경우 유니온 타입으로 반환하게끔 해놨다.
ex)

type T={
	a:1
  	myKey:{
    	a:10
    }
}
type U='myKey'
type Result=ExtractToObject<T, U>
//{
// a:1|10
//}

mapped type의 키에는 keyof Tkeyof T[U]가 들어간다.
이때, R이 U인 경우에는 배제한다.(U:T[U]가 결과에 들어갈 수 있기 때문)
Exlude<keyof T,U>를 통해 배제하지 않는 이유는 해당 방식을 사용하면 optional이 죽기 때문이다.

mapped type의 밸류에는 R이 Exclude<keyof T,U>를 확장하면 T[R],
R이 keyof T[U]를 확장하면 T[U][R]을 반환한다.

둘 다 속하는 경우 둘 다 반환한다(유니온으로)

다른 사람의 풀이

type ExtractToObject<T, U extends keyof T> =Omit<Omit<T, U> & T[U], never>

깔끔한 풀이이다.

T에서 U를 제거하고, 그 객체와 T[U]를 합치는 풀이이다.

Eqaul의 불합리함 때문에 Omit<대상,never>를 사용했다.

참고자료

https://github.com/type-challenges/type-challenges/issues/30450

0개의 댓글