← Усі задачіTypeScript · Middle
Mapped types: MyPick, MyReadonly, MyOmit
Напишіть власні версії утилітних типів без вбудованих Pick, Readonly, Omit і Exclude.
MyPick<T, K> лишає в T лише ключі K (і не дозволяє ключ, якого в T немає), MyReadonly<T> робить усі поля readonly на першому рівні, а MyOmit<T, K> прибирає ключі K, зберігаючи необов'язковість інших полів.
Ctrl+Enter - запустити тести. Tab - відступ; щоб вийти з редактора клавіатурою, натисніть Esc, а потім Tab. Код зберігається в цьому браузері.
Тести (5)
Тести типів перевіряє компілятор TypeScript у режимі strict. Expect<Equal<A, B>> проходить, коли типи збігаються точно, а // @ts-expect-error - коли наступний рядок не компілюється. Перший запуск завантажує компілятор, тож триває кілька секунд.
- типи
interface Todo { title: string; done: boolean; tags: string[] } type _ = Expect<Equal<MyPick<Todo, 'title' | 'done'>, { title: string; done: boolean }>>;
- типи
interface Todo { title: string; done: boolean } // @ts-expect-error - 'nope' is not a key of Todo type _ = MyPick<Todo, 'nope'>;
- типи
interface Todo { title: string; meta: { done: boolean } } type _ = Expect<Equal<MyReadonly<Todo>, { readonly title: string; readonly meta: { done: boolean } }>>;
- типи
interface Todo { title: string; done: boolean; tags: string[] } type _ = Expect<Equal<MyOmit<Todo, 'tags'>, { title: string; done: boolean }>>;
- типи
interface Todo { title: string; done?: boolean } type _ = Expect<Equal<MyOmit<Todo, 'title'>, { done?: boolean }>>;