타입 챌린지 2946 - ObjectEntries

소파의 벨로그·2025년 4월 13일

타입챌린지

목록 보기
53/131

문제 링크

문제

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]

linjunc의 풀이이다

신기하게 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

0개의 댓글