TypeScript Flashcards
Что такое TypeScript?
TypeScript - это язык программирования, который расширяет возможности JavaScript, добавляя в него статическую типизацию, интерфейсы и другие возможности.
Основные компоненты TypeScript?
Статическая типизация
Интерфейсы
Дженерики
Декораторы
Основные особенности TypeScript, не связанные с самим кодом?
- TypeScript является строго типизированным языком программирования, что позволяет выявлять ошибки на этапе компиляции.
- TypeScript имеет широкую поддержку в инструментах разработки, библиотеках и поддержку сообщества.
- Кроссплатформенный.
- TypeScript обеспечивает лучшую читаемость и поддерживаемость.
Минусы использования TypeScript?
- Дополнительное время на изучение языка и его особенностей.
- Необходимость компиляции кода перед запуском, что может замедлить процесс разработки.
- Не все библиотеки и фреймворки поддерживают TypeScript.
Особые типы в TypeScript.
Встроенные:
- void (отсутствие значения)
- any (любой тип)
- never (тип, который не имеет значений)
Определяемые пользователем:
- enum (перечисление)
- класс
- интерфейс
- tuple (кортеж)
- array (массив)
Что такое перечисление (enum)?
Тип данных.
Позволяет объявить набор именованных констант.
enum Colors { Red = "RED", Green = "GREEN", Blue = "BLUE" }
Значения могут быть как строками, так и числами.
Если значение не объявить, то значением будет индекс. Обращение по индексу так же возможно.
Декораторы в TypeScript.
По своему назначению - тоже самое что и обычные декораторы.
Могут применяться к классам, методам, свойствам и параметрам.
Применение происходит через вызов декоратора перед декорируемым элементом с помощью @
.
@classDecorator class MyClass { ... }
Как указать тип переменной, аргумента?
Указание типа происходит через :
.
const a: number = 1
- переменная
// Обычная функция function add(a: number, b: number): number { return a + b; }
Разница между типом (type) и интерфейсом (interface)?
Интерфейс подходит только для сложных сущностей, как объекты.
Интерфейс может (а тип нет):
- Реализовываться в классе
- Наследоваться другим интерфейсом
- Объединение интерфейсов новыми свойствами
- Описывать классы и функции
- Иметь перегруженные методы
Поддерживает ли TypeScript перегрузку функций?
Да, поддерживает.
Можно определить несколько сигнатур функции, а затем написать функцию, которая подходит под одно из описаний.
Перегрузка происходит определением одной и той же функции с разными параметрами.
myFunc(a: string): void myFunc(a: number): void myFunc(a: number) { console.log(a) }
Как TypeScript поддерживает необязательные и дефолтные параметры в функции?
Необязательные - ?
func demo(arg1: number, arg2? :number) { … }
Дефолтные - =
func demo(arg1: number, arg2: number = 4) { … }
Что такое общие типы (generic) в TypeScript?
Общие типы позволяют указывать тип в виде переменной. Эта переменная будет определена в момент выполнения.
Тем самым можно запоминать и заставлять использовать один и тот же тип в определённых местах.
Работает с функциями, классами и интерфейсами.
Дженерики могут наследоваться (extends
) от интерфейсов.
Разница между типами void
, never
и unknown
?
void
- для функций, которые ничего не возвращаютnever
- для функций, которые никогда не завершаются (бесконечная или ошибка)unknown
- используется для значений о которых не известно заранее, в отличие от any
требует проверки типа перед использованием
Разница между типами “Объединение” (|) и “Пересечение” (&)?
Объединение это логическое “ИЛИ”.
Пересечение это логическое “И”.
Пересечение в основном используется для пересечения объектов.
Сужение типов и защитники типов
Если есть проверка типа, то происходит сужение типов:
if (typeof val === 'number') { … }
Проверка наличия свойства в объекте:
if ('prop' in obj) { … }
Защитник типа - это функция, которая производит сужение типов. Её можно поставить вместо условия в if
.
Ключевая особенность это то что функция является предикатом (true
/false
), а тип который она возвращает указывается как “аргумент is тип
”.
function isAdmin(user: Manager | Admin): user is Admin { // защитник return 'role' in user } function hello(user: Manager | Admin) { if (isAdmin(user)) { // использование защитника console.log(user.role) // не будет ошибки } }