Readonly

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

Die Lösung dieses Problems liegt darin, jeden Schlüssel des Objektes als readonly zu definieren. Man erreicht dies durch eine Iteration über die Schlüssel / Attribute des Objektes und erzeugt hierdurch einen Mapped Type.

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

References