Что такое TypeScript?
TypeScript - это язык программирования, который расширяет возможности JavaScript, добавляя в него статическую типизацию, интерфейсы и другие возможности.
Основные компоненты 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) // не будет ошибки
}
}Utility Type преобразует все свойства типа T в необязательные
Partial<T></T>
Utility Type преобразует все свойства типа T в обязательные
Required<T></T>
Utility Type преобразует все свойства типа T в только для чтения
Readonly<T></T>
Utility Type создает тип объекта с ключами типа K и значениями типа T
Record<K, T>
K - тип или объединение типов, который может быть ключом (string, number)
в том числе могут быть строковые литералы ('cat' | 'dog' | 'bird’)
T - любой тип
Utility Type создает тип с подмножеством свойств типа T, заданных в K
Pick<T, K>
T - может быть любым объектным типом (или их множеством) и не может быть примитивом
K - строковые литералы и обязательно должны быть в T, иначе будет ошибка
Utility Type создает тип, исключив из T свойства, указанные в K
Omit<T, K>
T - может быть любым объектным типом (или их множеством) и не может быть примитивом
K - строковые литералы и обязательно должны быть в T, иначе будет ошибка
Utility Type создает тип, исключив из T те типы, которые также присутствуют в U
Exclude<T, U>
Ограничений по T и U нет. Главное что бы в T были значения из U.
Utility Type создает тип, который включает только те типы из T, которые также присутствуют в U
Extract<T, U>
Ограничений по T и U нет. Главное что бы в T были значения из U.
Utility Type создает тип, исключив из T null и undefined
NonNullable<T></T>