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<T>("myString");
Компилятор автоматически установит значение типа для дженерика</T></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>
Conditional Types. (тип зависит от условия)
type Example1 = Dog extends Animal ? number : string;
Mapped Types. Mapping Modifiers
++++ Mapped Types +++++
Переопределение типа через перебор ключей
type OptionsFlags<Type> = {
[Property in keyof Type]: boolean;
};</Type>
type Features = {
darkMode: () => void;
newUserProfile: () => void;
};
type FeatureOptions = OptionsFlags<Features>;</Features>
//console.log()
type FeatureOptions = {
darkMode: boolean;
newUserProfile: boolean;
}
++++Mapped Modifiers++++
К readonly и ? можно дополнительно применить модификаторы + и - при мапинге типов. + это значение по умолчанию
// Removes ‘readonly’ attributes from a type’s properties
type CreateMutable<Type> = {
-readonly [Property in keyof Type]: Type[Property];
};</Type>
type LockedAccount = {
readonly id: string;
readonly name: string;
};
type UnlockedAccount = CreateMutable<LockedAccount>;
//console.log()
type UnlockedAccount = {
id: string;
name: string;
}</LockedAccount>
ts при работе со строками. шаблонная строка, Uppercase, Lowercase, Capitalize, Uncapitalize
Шаблонные строки
type EmailLocaleIDs = “welcome_email” | “email_heading”;
type FooterLocaleIDs = “footer_title” | “footer_sendoff”;
type AllLocaleIDs = ${EmailLocaleIDs | FooterLocaleIDs}_id
;
type AllLocaleIDs = “welcome_email_id” | “email_heading_id” | “footer_title_id” | “footer_sendoff_id”
//console.log(AllLocalelDs)
//type AllLocaleIDs = “welcome_email_id” | “email_heading_id” | “footer_title_id” | “footer_sendoff_id”
++++Uppercase<StringType>+++++
Преобразует каждый символ в строке в заглавную версию.</StringType>
++++Lowercase<StringType>+++++
Преобразует каждый символ в строке в строчный эквивалент.</StringType>
++++Capitalize<StringType>+++++
Преобразует первый символ строки в эквивалент в верхнем регистре.</StringType>
++++Uncapitalize<StringType>+++++
Преобразует первый символ строки в строчный эквивалент.</StringType>
Пространство имен (namespace)
Пространства имен — это специфичный для TypeScript способ организации кода.
Некая схема организации, чтобы мы могли отслеживать наши типы и не беспокоиться о конфликтах имен с другими типами данных. Внутри пространства имен можно размещать классы, интерфейсы, функции, переменные и даже другие пространства имен.
Вся логика которая нужна вне namespace экспортируется
namespace MyNamespace {
export class MyClass {
greet() {
console.log(“Hello from MyClass”);
}
}
export function myFunction() { console.log("Hello from myFunction"); } export const myVariable = "Hello from myVariable"; }
Наверное использовать хорошо в библиотеках
enum
Перечисления позволяют разработчику определять набор именованных констант.
Может пригодится для автозаполнения констант значениями или
enum Direction {
Up = 1,
Down,
Left,
Right,
}
type predicates
Прогноз типа (is)
Используется для определения типа в возвращаемой функции.
function isFish(pet: Fish | Bird): pet is Fish {
return (pet as Fish).swim !== undefined;
}
Ключевое слово infer
Ключевое слово infer можно использовать только в условных типах.
Это ключевое слово позволяет нам определить переменную внутри нашего ограничения, на которую можно ссылаться или возвращать.
таски которые не сделал
hard
extrime
0000012
0000020
0000043
00191
00296
00298
00599
00612
https://github.com/type-challenges/type-challenges/tree/main/questions/00645-medium-diff
остановился на 00645