인터페이스에서 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 T나 keyof 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