TS Flashcards

1
Q

зачем Typescript

A

TypeScript — это JavaScript с синтаксисом для типов.

  • TypeScript делает код проще для чтения и понимания
  • Главное преимущество TypeScript в том, что он может выделять неожиданное поведение в вашем коде, снижая вероятность ошибок.
  • Упрощает разработку в команде
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Generics. Использовал? Для чего? Как описываются?
Ограничения в Generic

A

Дженерики — это о связи двух или более значений с одним и тем же типом.

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>

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Декораторы. Пользовался? Для чего? Как описываются В тс

A

Декоратор — это функция, которая может быть присоединена к объявлению класса , методу , свойству или параметру.
Задает дополнительный функционал.
@sealed
class BugReport {
type = “report”;
title: string;

constructor(t: string) {
this.title = t;
}
}

function sealed(constructor: Function) {
Object.seal(constructor);
Object.seal(constructor.prototype);
}

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Приведи примеры utility-типов в TS?

A

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Различие type от interface

A

interface и type используются для описания типа.

Отличия:
1. —–
Расширение типа в interface происходит через extends:
interface Animal {
name: string;
}
interface Bear extends Animal {
honey: boolean;
}
Расширение типа через пересечения типов
type Animal = {
name: string;
}

type Bear = Animal & {
honey: boolean;
}

  1. Если прописать интерфейсы с одинаковыми именами их поля суммируются (добавляются)
    interface Window {
    title: string;
    }
    interface Window {
    ts: TypeScriptAPI;
    }

В типах это вызовет ошибку
type Window = {
title: string;
}
type Window = {
ts: TypeScriptAPI;
}
// Error: Duplicate identifier ‘Window’.

  1. Интерфейсы можно использовать только для объявления форм объектов. Для определения примитивных значений они не подходят
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

strictNullChecks и Оператор ненулевого значения (!)

A

strictNullChecks - режим который включает или выключает проверку значений на null или undefined

Оператор ненулевого значения(!) -
удаление null и undefined из типа без какой-либо явной проверки
console.log(x!.toFixed());

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

void never any unknown

A

Void — явно указывать на то, что у функции или метода отсутствует возвращаемое значение (или undefined)

never — указывает что функция никогда ничего не вернет. Указывается в бесконечных циклах или в функциях всегда показывающих ошибки

any — при использовании он просто отключает проверку типов. Использовать когда описание типа будет очень долгим и это не нужно в программе???

unknown - заставляет вас проверять тип, прежде чем вы сможете использовать эту переменную. Подходит для ситуаций когда мы не знаем заранее какой тип данных будет использован в переменной.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Описание аргументов функции

A

type DescribableFunction = {
(someArg: number): boolean;
};

function doSomething(fn: DescribableFunction) {
console.log(fn(6));
}

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Перегрузки функций

A

Некоторые функции могут вызываться с различным количеством аргументов и их типов.

Спецификации для перегрузки функций в тс
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);
}
}

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Объявление this в функции

A

Используется в случаях когда требуется больше контроля над тем что из себя представляет this. this объявляется как аргумент.

interface DB {
filterUsers(filter: (this: User) => boolean): User[];
}

const db = getDB();
const admins = db.filterUsers(function (this: User) {
return this.admin;
});

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

rest в ts

A

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);

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Определение объекта с неизвестным кол-вом свойств

A

Если SquareConfig может иметь color и width свойства, но также может иметь любое количество других свойств, то мы могли бы определить его следующим образом:

interface SquareConfig {
color?: string;
width?: number;
[propName: string]: unknown;
}

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Тип кортежа

A

Тип кортежа — это еще один вид Array типа, который точно знает, сколько элементов он содержит и какие именно типы он содержит в определенных позициях.

type StringNumberPair = [string, number];

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

readonly

A

Если не хотим чтобы тип изменялся в коде, пишем readonly:

function doSomething(pair: readonly [string, number]) {
// …
}

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Ковариантность, Инвариантность, Бивариантность

A

Ковариантность — это механизм, позволяющий использовать более конкретный тип там, где изначально предполагалось использовать менее конкретный тип. 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>

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Conditional Types. (тип зависит от условия)

A

type Example1 = Dog extends Animal ? number : string;

17
Q

Mapped Types. Mapping Modifiers

A

++++ 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>

18
Q

ts при работе со строками. шаблонная строка, Uppercase, Lowercase, Capitalize, Uncapitalize

A

Шаблонные строки
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>

19
Q

Пространство имен (namespace)

A

Пространства имен — это специфичный для 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"; }

Наверное использовать хорошо в библиотеках

20
Q

enum

A

Перечисления позволяют разработчику определять набор именованных констант.
Может пригодится для автозаполнения констант значениями или

enum Direction {
Up = 1,
Down,
Left,
Right,
}

21
Q

type predicates
Прогноз типа (is)

A

Используется для определения типа в возвращаемой функции.
function isFish(pet: Fish | Bird): pet is Fish {
return (pet as Fish).swim !== undefined;
}

22
Q

Ключевое слово infer

A

Ключевое слово infer можно использовать только в условных типах.
Это ключевое слово позволяет нам определить переменную внутри нашего ограничения, на которую можно ссылаться или возвращать.

23
Q

таски которые не сделал

A

hard
extrime
0000012
0000043
00191
00296
00298
00599
00612

https://github.com/type-challenges/type-challenges/tree/main/questions/00645-medium-diff

остановился на 00645