Object.entries의 타입 버전을 구현해라
Implement the type version of Object.entries
type ObjectEntriesImplement<T,RT=Required<T>,U = keyof RT> = U extends keyof RT?[U,[RT[U]] extends [never]?undefined:RT[U]]:never;
type ObjectEntries<T>=ObjectEntriesImplement<T>
T 대신 RT라는 제네릭을 별도로 선언해주었다.
RT 대신 T를 사용할 경우 optional 프로퍼티인 RT[U]를 하면 undefined가 들어간다.
never 분기처리를 한 이유는 Required에 optional인 undefined 프로퍼티를 넣으면 never 값이 나오기 때문이다.
type RemoveUndefined<T> = [T] extends [undefined] ? T : Exclude<T, undefined>
type ObjectEntries<T> = {
[K in keyof T]-?: [K, RemoveUndefined<T[K]>]
}[keyof T]
신기하게 undefined만 있으면 undefined만 주고 그렇지 않으면 undefined를 제거하는 타입을 별도로 만들었다
이 풀이는 마지막에 있는 케이스(프로퍼티 타입에 undefined 유니온이 들어감)를 설명하지 못한다.
다만 keyof T를 타입에 넣어 일일히 분해하지 않았다
type a=Required<{key?:undefined}> // {key:never}
Required에 optional 프로퍼티를 넣으면 never 값이 나오는 것이 이상하다고 생각해 찾아보았으나, 관련 자료나 이슈를 찾기가 어려웠다.
https://github.com/type-challenges/type-challenges/issues/14052