객체의 모든 파라미터(그리고 하위의 객체들을 재귀적으로) 변할 수 있게 만드는 DeepMutable<T>를 구현하라
Implement a generic DeepMutable<T> which make every parameter of an object - and its sub-objects recursively - mutable.
type DeepMutable<T extends object> = {
-readonly [R in keyof T]: T[R] extends Function?T[R]
:T[R] extends object?DeepMutable<T[R]>:T[R]
}
mapped type으로 구현했다.
우선 모든 readonly를 없애기 위해 - 연산자를 사용했다.
그리고 object가 아니면 해당 T[R]은 그대로 반환,
object면 DeepMutable<T[R]>을 반환한다.
이때 Function임을 확인하는 이유는 Function이 object를 확장가능하기 때문이다.
이와 관련해서 어떤 경우에 Function이 확장가능한지 (ex:()=>{}는 Function을 확장가능한가? call signiture가 있으면 Function인가?) 추가적인 조사가 필요해보인다.
https://www.typescriptlang.org/docs/handbook/2/functions.html#call-signatures