HTTP & TypeScript Flashcards
heh (18 cards)
Что такое HTTP? В чём разница между HTTP и HTTPS? Из чего состоит HTTP?
HTTP (HyperText Transfer Protocol) — протокол для передачи данных между клиентом и сервером в интернете.
Разница между HTTP и HTTPS: HTTP передаёт данные в открытом виде, а HTTPS использует шифрование SSL/TLS.
Структура HTTP:
Запрос (Request)
* Метод: GET (получить данные), POST (отправить), PUT, DELETE и др.
*URL: Адрес ресурса (например, /index.html).
*Заголовки (Headers): Дополнительная информация (User-Agent, Cookie).
*Тело (Body): Данные (если есть, например, у POST).
Ответ (Response)
*Статус-код: 200 (OK), 404 (Not Found), 500 (Server Error).
*Заголовки: Тип данных (Content-Type), куки и др.
*Тело: HTML, JSON, картинка и т. д.
Пример использования fetch для получения данных с API: fetch(‘https://api.example.com/users’).then(res => res.json()).then(data => console.log(data));
Что означают статус-коды 100, 200, 300, 400, 500?
HTTP-статус-коды указывают результат обработки запроса: 100-е (информационные), 200-е (успех), 300-е (редиректы), 400-е (ошибка клиента), 500-е (ошибка сервера).
Пример обработки статусов: fetch(‘url’).then(res => { if (res.status === 200) return res.json(); if (res.status === 404) throw new Error(‘Not found’); });
Что такое CORS, и зачем он нужен?
CORS (Cross-Origin Resource Sharing) — механизм безопасности в браузерах, регулирующий кросс-доменные запросы. Он защищает от несанкционированных запросов, но разрешает безопасные API. Браузер проверяет заголовок Access-Control-Allow-Origin.
Пример использования fetch с CORS: fetch(‘https://api.other-domain.com’, { method: ‘POST’, headers: { ‘Custom-Header’: ‘value’ } });
Что такое REST API?
REST API (Representational State Transfer) — архитектурный стиль для API, использующий HTTP для работы с ресурсами. Методы: GET(получить), POST(отправить), PUT(заменить), DELETE(удалить), PATCH(частично обновить).
Пример запроса к REST API: fetch(‘https://api.example.com/users’, { method: ‘POST’, headers: { ‘Content-Type’: ‘application/json’ }, body: JSON.stringify({ name: ‘Alice’ }) });
Что такое preflight-запрос в контексте CORS?
Preflight-запрос — это HTTP-запрос с методом OPTIONS, отправляемый браузером перед сложным кросс-доменным запросом для проверки его разрешений. Сервер отвечает заголовками Access-Control-Allow-Origin и другими.
Пример использования preflight: fetch(‘https://api.other-domain.com’, { method: ‘PUT’, headers: { ‘X-Custom’: ‘value’ } });
Как защититься от CSRF и XSS на клиентской стороне?
CSRF (Cross-Site Request Forgery): Атака, где злоумышленник подделывает запрос от имени пользователя (например, перевод денег через форму).
Защита: CSRF-токены в заголовках/формах.
XSS (Cross-Site Scripting): Атака, где злоумышленник внедряет скрипт в страницу.
Защита: Экранировать ввод, использовать DOMPurify, избегать dangerouslySetInnerHTML.
Пример защиты от XSS: import DOMPurify from ‘dompurify’; const clean = DOMPurify.sanitize(userInput);
Какие типы запросов есть?
Типы HTTP-запросов: GET (получить), POST (создать), PUT (заменить), DELETE (удалить), PATCH (частично обновить), HEAD (только заголовки), OPTIONS (проверка разрешённых методов).
Пример запроса GET: fetch(‘https://api.example.com/users’, { method: ‘GET’ }).then(res => res.json());
Что такое CDN, и зачем его использовать?
CDN (Content Delivery Network) — сеть серверов, кэширующих статические ресурсы с ближайшего к пользователю сервера. Зачем: ускоряет загрузку страниц, снижает нагрузку на сервер, повышает надёжность.
Пример использования CDN:
Что такое TypeScript, и чем он отличается от JavaScript?
TypeScript — надмножество JavaScript, добавляющее статическую типизацию, компилируемое в JS. Он ловит ошибки типов на этапе компиляции, улучшая надёжность. Отличия: типы, интерфейсы, дженерики.
Пример функции в TypeScript: function greet(user: { name: string }) { return Hi, ${user.name}
; }
Чем interface отличается от type?
interface и type в TypeScript задают типы данных.
Interface: Для объектов, можно расширять (extends) и дополнять.
interface User { name: string; } interface User { age: number; } // Теперь { name, age }
Type: Для всего (объекты, строки, числа), поддерживает объединения (|) и пересечения (&).
type Name = string | number; type UserWithId = User & { id: number };
Различия: interface лучше для объектов и дополнений, type — для гибких комбинаций.
Пример:
interface Car { model: string; } type Color = 'red' | 'blue';
Пример интерфейса: interface User { name: string; }
Что такое Utility Types?
Utility Types — встроенные типы TypeScript для трансформации существующих типов. Например, Partial<T> делает все свойства необязательными, Pick<T, K> выбирает свойства, Omit<T, K> удаляет.</T>
Пример использования Partial: const user: Partial<User> = { name: 'Alice' };</User>
Как задать тип для объекта с необязательными полями?
Для объекта с необязательными полями используйте ? в интерфейсе или Partial<T>( если все поля необязательны).
?:</T>
interface User { name?: string; age?: number; }
Пример с Partial: const partial: Partial<User> = { name: 'Alice' };</User>
В чём разница между unknown и any?
-
any: Отключает проверку типов, позволяет всё, но небезопасно.
typescript let x: any = 42; x = 'text'; x.foo(); // Без ошибок, но может сломаться
-
unknown: Требует проверки типа перед использованием, безопаснее.
typescript let x: unknown = 42; if (typeof x === 'string') x.toUpperCase(); // OK x.foo(); // Ошибка
Пример: fetch('url').then(res => res.json() as Promise<unknown>);
Как работает оператор as в TypeScript?
Оператор as
указывает TypeScript, что значение имеет определённый тип.
- Используется с API или DOM:
typescript const input = document.querySelector('input') as HTMLInputElement; input.value = 'text';
Для обхода строгой типизации, когда вы уверены в типе больше, чем TS
Опасно, если тип неверный: value as number
может вызвать ошибку в runtime.
Как типизировать React-компонент с помощью TypeScript?
Функциональные компоненты
Используем React.FC<Props> или явно указываем тип пропсов в параметрах.</Props>
Пропсы описываем через interface или type.
Необязательные пропсы помечаем ?.
Классовые компоненты
Наследуемся от React.Component<Props, State>.
Указываем типы пропсов и состояния.
Children
Лучший тип — React.ReactNode (подходит для любого содержимого).
События
Встроенные типы: React.ChangeEvent, React.MouseEvent и др.
Пример: (e: React.ChangeEvent<HTMLInputElement>) => void.</HTMLInputElement>
Refs
useRef<HTMLInputElement>(null) + React.forwardRef для переиспользуемых компонентов.</HTMLInputElement>
Контекст
Создаём контекст с типом: React.createContext<Type | undefined>.
Проверяем undefined через хук или defaultValue.
Дженерики
Полезны для компонентов, работающих с разными типами данных.
Пример: function List<T>({ items }: { items: T[] }).</T>
Хуки
useState<Type>() — явно указываем тип состояния.</Type>
useReducer типизируем через Action и State.
React.FC
добавляет тип children
автоматически.
Что такое дженерик?
Дженерик — это механизм в TypeScript, который позволяет создавать функции и компоненты, работающие с разными типами данных, задаваемыми при их использовании, обеспечивая безопасность типов.
function identity<T>(value: T): T { return value; } const num = identity<number>(42); // T = number const str = identity<string>('hi'); // T = string
Для массивов:
interface List<T> { items: T[]; } const numbers: List<number> = { items: [1, 2, 3] };
Используется в Array<T>
, Promise<T>
. Ограничения: T extends string
.
Что такое кортеж?
Кортеж — массив с фиксированной длиной и типами элементов.
type Point = [number, number]; const coord: Point = [10, 20]; // OK coord[2] = 30; // Ошибка coord[0] = 'text'; // Ошибка
- Полезно для пар или координат:
type KeyValue = [string, number]; const pair: KeyValue = ['id', 1];
Кортеж проверяет порядок и длину, в отличие от Array<number>
.
Что такое extends?
Ключевое слово extends используется для наследования в классах и расширения типов/интерфейсов.extends
используется для наследования в интерфейсах и ограничения типов в дженериках.
Для классов: class Child extends Parent → наследование методов и полей.
Для интерфейсов: interface B extends A → объединение свойств.
В условных типах: T extends string ? … → проверка типа.
В дженериках: <T> → ограничение типа.</T>
Условные типы: type IsString<T> = T extends string ? string : number;