Обобщенные типы и операции с типами
Цель: освоиться с более сложной работой с типами, используя различные операторы.
Порядок выполнения лабораторной работы:
Решите предложенные задачи на операции с типами в новой ветке от начального коммита или в ветке с задачами из предыдущих лабораторных работ.
Задачи
Если
Реализуйте обобщенный тип If<C, T, F>
, который принимает условие C, истинное значение T и ложное значение F. Ожидается, что C будет либо истинным, либо ложным, в то время как T и F могут быть любого типа.
Пригодится условный тип.
If<true, 'a', 'b'> ---> 'a'
If<false, 'a', 'b'> ---> 'b'
Первый в массиве
Реализуйте обобщенный тип First<T>
, который принимает массив T и возвращает тип его первого элемента.
Пригодятся условные типы, оператор индексированного доступа и то что у массивов есть свойство длины.
First<[3, 2, 1]> ---> 3
First<[() => 123, { a: string }]> ---> () => 123
First<[]> ---> never
First<[undefined]> ---> undefined
Ожидаемый тип
Реализуйте обобщенный тип MyAwaited<T>
, чтобы получить тип, который находится внутри обернутого типа, например в Promise.
Пригодятся условные типы и infer.
MyAwaited<Promise<string>> ---> string
MyAwaited<Promise<{ field: number }>> ---> { field: number }
MyAwaited<Promise<string | number>> ---> string | number
Кортеж в объединение
Реализуйте обобщенный тип TupleToUnion<T>
, который создает объединенный тип из его значений.
Пригодятся условные типы и infer.
TupleToUnion<['1', '2', '3']> ---> '1' | '2' | '3'
TupleToUnion<[1, 2, 3]> ---> 1 | 2 | 3
Кортеж в объект
Реализуйте обобщенный тип TupleToObject<T>
, который получив кортеж, преобразует его в объектный тип, где ключ и значение совпадают и являются элементами массива.
Пригодятся сопоставленные типы (in), оператор индексированного доступа.
const tuple1 = [1, 2, 3] as const
TupleToObject<typeof tuple1> ---> {1:1,2:2,3:3}
const tuple2 = ['a', 'b', 'c'] as const
TupleToObject<typeof tuple> ---> {'a': 'a', 'b': 'b', 'c': 'c'}
Github
Зафиксируйте результаты работы с помощью системы контроля версий git в репозиторий на github. Отправьте коммиты на ваш репозиторий в Classroom.
Требования
- Реализованы обобщенные типы.
Результат выполнения
Код удовлетворяющий требованиям, сохраненный в коммите на удаленном репозитории.
Источники для занятия
- Creating Types from Types
- TypeScript: infer и conditional types. Продвинутый TS на примерах
- Карманная книга по TypeScript. Часть 6. Манипуляции с типами
Основные источники по TS
- The TypeScript Handbook
- Типизация - лекция от яндекса
- Типизация продвинутый - лекция от яндекса
- Справочник Typescript (не последняя версия)
- Серия статей Изучение TypeScript
- Курс TypeScript
Вопросы для защиты
- Условные типы (Conditional Types) и infer
- Оператор индексированного доступа (Indexed Access Types)
- Сопоставленные типы (Mapped Types)
- Keyof и Typeof
- ES модули
- Словами объяснить как работают
Record<Keys, Type>
/Omit<Type, Keys>
/Readonly<Type>