모든 필수 필드를 남기는 고급 유틸 타입 GetRequired<T>를 구현하라
Implement the advanced util type GetRequired<T>, which remains all the required fields
type RequiredKey<T,K = keyof T>=
K extends keyof T?
Pick<T,K> extends Required<Pick<T,K>>?K:never
:never
type GetRequired<T> = {[R in RequiredKey<T>]:R extends keyof T?T[R]:never}
Required인 키 들을 뽑아내서 mapped type에 할당하는 방식으로 구현했다.
Required인 키를 뽑아내는 방식은 다음과 같다.
T에서 모든 키 별로 모든 값을 뽑아낸다.
ex){a:1,b?:2}라면 {a:1}|{b?:2}
이렇게 뽑아낸 값에 required를 붙여본다.
뽑아낸 값과 required를 붙인 값이 같으면 해당 키는 required, 그렇지 않다면 partial인 키라는 의미이다.