Challenge

Implement the built-in Readonly<T> generic without using it.

Constructs a type with all properties of T set to readonly, meaning the properties of the constructed type cannot be reassigned.

For example:

interface Todo {
  title: string;
  description: string;
}

const todo: MyReadonly<Todo> = {
  title: "Hey",
  description: "foobar",
};

todo.title = "Hello"; // Error: cannot reassign a readonly property
todo.description = "barFoo"; // Error: cannot reassign a readonly property

Solution

We need to make all the properties in the object read-only. Therefore, we need to iterate over all the properties and add a modifier to them.

We are going to use the usual Mapped Type here, nothing serious. For each property in the type, we take its key and add a readonly modifier to it:

type MyReadonly<T> = { readonly [K in keyof T]: T[K] };

References