챌린지

T에 속한 모든 프로퍼티가 변경 가능한 상태로 만드는 제네릭 Mutable<T>를 구현 해보세요.

예시:

interface Todo {
  readonly title: string;
  readonly description: string;
  readonly completed: boolean;
}

// { title: string; description: string; completed: boolean; }
type MutableTodo = Mutable<T>;

해답

(제 의견으로는) 보통 난이도에 있으면 안될 것 같은 챌린지입니다. 큰 고민없이 문제 를 풀 수 있습니다. 다만 모든 문제를 푸는 것이 목표이기 때문에 난이도의 적절함에 대한 고민은 더 하지 않겠습니다.

오브젝트의 프로퍼티에 읽기전용 제어자를 붙일 수 있다는 것은 이미 알고 있습니다. Readonly challenge를 해결하기 위해 제어자를 사용한 적 있었 습니다. 이번 경우에는 타입에서 제어자를 제거하는 것을 요구하고 있습니다.

가장 단순한 것부터 시작하겠습니다. 매핑 타입을 사용해 주어지는 타입을 복사합니다 :

type Mutable<T> = { [P in keyof T]: T[P] };

이제 읽기전용 제어자가 붙은 T의 복사본이 있습니다. 제어자를 어떻게 제거할 수있 을까요? 지난 챌린지에서 매핑 타입에 readonly 키워드를 추가했던 것을 떠올려봅시 다:

type Mutable<T> = { readonly [P in keyof T]: T[P] };

암시적으로 타입스크립트는 readonly 키워드에 +를 더해주고 이것은 프로퍼티에제 어자를 더해주고 싶다는 의미입니다. 이번 경우에는 제어자를 제거하고 싶기 때문에 -를 대신 사용할 수 있습니다:

type Mutable<T> = { -readonly [P in keyof T]: T[P] };

이 방식으로 읽기전용 제어자를 프로퍼티에서 제거하는 타입을 구현할 수 있습니다.

참고