TS Flashcards
зачем Typescript
TypeScript — это JavaScript с синтаксисом для типов.
- TypeScript делает код проще для чтения и понимания
- Главное преимущество TypeScript в том, что он может выделять неожиданное поведение в вашем коде, снижая вероятность ошибок.
- Упрощает разработку в команде
Generics. Использовал? Для чего? Как описываются?
Ограничения в Generic
Дженерики — это о связи двух или более значений с одним и тем же типом.
function identity<Type>(arg: Type):Type {
or
const identity = <T>(arg: T): T => { return arg; }</T></Type>
обобщенные типы. Они нужны для описания похожих, но отличающихся какими-то характеристиками типов.
В основном generic используются для создания более переиспользуемых типов, более гипких.
Те generic позволяет пробросить тип (как аргумент в функцию например) и создать новый
//ОГРАНИЧЕНИЯ В ДЖЕНЕРИКАХ
function longest<Type extends { length: number }>(a: Type, b: Type) {
if (a.length >= b.length) {
return a;
} else {
return b;
}
}
// longerArray is of type ‘number[]’
const longerArray = longest([1, 2], [1, 2, 3]);
// Error! Numbers don’t have a ‘length’ property
const notOK = longest(10, 100);
Создание шаблона типа из дженериков:
interface Box<Type> {
contents: Type;
}
let box: Box<string>; или
let box: Box<Array<string>>;
Используется если в объекте бывают разные типы, можем описание перегрузок</string></string></Type>
После того как мы написали функцию (тип) дженерик мы можем вызвать ее двумя способами:
1. let output = identity<string>("myString");
Передать все аргументы в дженерик
2.let output = identity("myString");
Компилятор автоматически установит значение типа для дженерика</string>
Декораторы. Пользовался? Для чего? Как описываются В тс
Декоратор — это функция, которая может быть присоединена к объявлению класса , методу , свойству или параметру.
Задает дополнительный функционал.
@sealed
class BugReport {
type = “report”;
title: string;
constructor(t: string) {
this.title = t;
}
}
function sealed(constructor: Function) {
Object.seal(constructor);
Object.seal(constructor.prototype);
}
Приведи примеры utility-типов в TS?
utility - типы - типы для преобразования существующих типов и создания нового
Awaited - Определяет тип который будет получен после выполнения промиса
type A = Awaited<Promise<string>>;
type A = string</string>
Partial<Type> - Создает тип со всеми свойствами, установленными в необязательное значение.</Type>
Required<Type> - Создает тип со всеми свойствами, установленными в обязательное значение.</Type>
Readonly<Type> -
Создает тип со всеми свойствами, Type, установленными в значение readonly, что означает, что свойства сконструированного типа не могут быть переназначены.</Type>
Pick<Type, Keys> - Создает тип, выбирая набор свойств Keys из Type.
Omit<Type, Keys> - Создает тип, выбирая все свойства из Type и затем удаляя Keys. Противоположность Pick.
Различие type от interface
interface и type используются для описания типа.
Отличия:
1. —–
Расширение типа в interface происходит через extends:
interface Animal {
name: string;
}
interface Bear extends Animal {
honey: boolean;
}
Расширение типа через пересечения типов
type Animal = {
name: string;
}
type Bear = Animal & {
honey: boolean;
}
- Если прописать интерфейсы с одинаковыми именами их поля суммируются (добавляются)
interface Window {
title: string;
}
interface Window {
ts: TypeScriptAPI;
}
В типах это вызовет ошибку
type Window = {
title: string;
}
type Window = {
ts: TypeScriptAPI;
}
// Error: Duplicate identifier ‘Window’.
- Интерфейсы можно использовать только для объявления форм объектов. Для определения примитивных значений они не подходят
strictNullChecks и Оператор ненулевого значения (!)
strictNullChecks - режим который включает или выключает проверку значений на null или undefined
Оператор ненулевого значения(!) -
удаление null и undefined из типа без какой-либо явной проверки
console.log(x!.toFixed());
void never any unknown
Void — явно указывать на то, что у функции или метода отсутствует возвращаемое значение (или undefined)
never — указывает что функция никогда ничего не вернет. Указывается в бесконечных циклах или в функциях всегда показывающих ошибки
any — при использовании он просто отключает проверку типов. Использовать когда описание типа будет очень долгим и это не нужно в программе???
unknown - заставляет вас проверять тип, прежде чем вы сможете использовать эту переменную. Подходит для ситуаций когда мы не знаем заранее какой тип данных будет использован в переменной.
Описание аргументов функции
type DescribableFunction = {
(someArg: number): boolean;
};
function doSomething(fn: DescribableFunction) {
console.log(fn(6));
}
Перегрузки функций
Некоторые функции могут вызываться с различным количеством аргументов и их типов.
Спецификации для перегрузки функций в тс
function makeDate(timestamp: number): Date;
function makeDate(m: number, d: number, y: number): Date;
function makeDate(mOrTimestamp: number, d?: number, y?: number): Date {
if (d !== undefined && y !== undefined) {
return new Date(y, mOrTimestamp, d);
} else {
return new Date(mOrTimestamp);
}
}
Объявление this в функции
Используется в случаях когда требуется больше контроля над тем что из себя представляет this. this объявляется как аргумент.
interface DB {
filterUsers(filter: (this: User) => boolean): User[];
}
const db = getDB();
const admins = db.filterUsers(function (this: User) {
return this.admin;
});
rest в ts
function multiply(n: number, …m: number[]) {
return m.map((x) => n * x);
}
// ‘a’ gets value [10, 20, 30, 40]
const a = multiply(10, 1, 2, 3, 4);
Определение объекта с неизвестным кол-вом свойств
Если SquareConfig может иметь color и width свойства, но также может иметь любое количество других свойств, то мы могли бы определить его следующим образом:
interface SquareConfig {
color?: string;
width?: number;
[propName: string]: unknown;
}
Тип кортежа
Тип кортежа — это еще один вид Array типа, который точно знает, сколько элементов он содержит и какие именно типы он содержит в определенных позициях.
type StringNumberPair = [string, number];
readonly
Если не хотим чтобы тип изменялся в коде, пишем readonly:
function doSomething(pair: readonly [string, number]) {
// …
}
Ковариантность, Инвариантность, Бивариантность
Ковариантность — это механизм, позволяющий использовать более конкретный тип там, где изначально предполагалось использовать менее конкретный тип. A > B и A = B.
// Covariant annotation
interface Producer<out> {
make(): T;
}</out>
Контравариантность — это противоположный ковариантности механизм, позволяющий использовать менее конкретный тип там, где изначально предполагалось использовать более конкретный тип
A < B и A = B
// Contravariant annotation
interface Consumer<in> {
consume: (arg: T) => void;
}</in>
Бивариантность — это механизм, который является представлением всех перечисленных ранее видов вариантности. A > B, A < B и A = B.
// Invariant annotation
interface ProducerConsumer<in> {
consume: (arg: T) => void;
make(): T;
}</in>