Проблема

Реализовать встроенный Readonly<T> не используя его. Этот тип создает новый объект с неизменяемыми свойствами из объекта T. Например:

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

Решение

Нам нужно взять все свойства из объекта T и сделать их неизменяемыми. Следовательно, нам нужно их перечислить и добавить модификатор readonly к каждому из свойств.

Для того чтобы перечислить свойства объекта, можно использовать сопоставляющие типы. Для каждого ключа из объекта, добавляем модификатор readonly, а значение берём без изменений из T.

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

Что почитать