Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .yaspellerrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,7 @@ module.exports = {
"ts",
"tsd",
"tsdef",
"tsdoc",
"TSLint",
"typeof",
"U pdate",
Expand Down Expand Up @@ -183,6 +184,7 @@ module.exports = {
"гугл",
"деплой",
"деплоя",
"дженерики",
"десериализация",
"диспатчу",
"дождидесь",
Expand Down
1 change: 1 addition & 0 deletions lessons/lesson27/lecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -454,3 +454,4 @@ function isFish(pet: Fish | Bird): pet is Fish {
- [TypeScript: Обобщённые типы](https://canonium.com/articles/typescript-generics/)
- [Обобщенные типы и классы. Документация TypeScript](http://typescript-lang.ru/docs/Generics.html)
- [Typescript: Объединение типов в глубину](https://habr.com/ru/post/526998/)
- [Продвинутые дженерики в TypeScript — Александр Николаичев](https://www.youtube.com/watch?v=YDTZpQrBXjc)
125 changes: 125 additions & 0 deletions lessons/lesson28/lecture.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
---
title: Занятие 28
description: Разработка собственного API
---

# OTUS

## Javascript Basic

<!-- v -->

### Вопросы?

<!-- s -->

### Разработка собственного API

<!-- v -->

Что такое `API` ?

<!-- v -->

Именование:

- типы и интерфейсы описывают ЧТО происходит
- реализации могут говорить, как это происходит

<!-- v -->

```ts
interface Storage {
getItem(key: string): string | null;
setItem(key: string, value: any): void;
}

class LocalStorage implements Storage {}
```

<!-- v -->

Документирование интерфейсов

- публичные свойства и методы
- для методов определяем типы принимаемых аргументов, и тип возвращаемого значения
- при необходимости типизируем контекст (`this`)

<!-- v -->

Передача параметров:

- Передача параметров через конфигурационный объект
- Ограничивать число параметров 3 мя (и дальше переходить на конфигурационный объект)

<!-- v -->

```ts
function draw1(color: string, x: number, y: number): void {}
function draw2({
color,
x,
y,
}: {
color: string;
x: number;
y: number;
}): void {}
```

<!-- v -->

Асинхронный / синхронный интерфейс

<!-- v -->

Универсальный подход - делать **весь** код асинхронным. Но это плохо сказывается на производительности.

Минимальный список задач для асинхронных интерфейсов:

- чтение/сохранение данных
- ввод/вывод данных от пользователя
- валидации / сложные обработки данных
- работа с удаленными ресурсами

<!-- v -->

Асинхронный интерфейс может быть задан:

- callback-функцией
- Promise-интерфейсом
- событиями

<!-- v -->

Для callback функций есть стандартное [error-first соглашение](http://fredkschott.com/post/2014/03/understanding-error-first-callbacks-in-node-js/)

```ts
function asyncOperation(param: any, (error: Error | null, data: any) => {});
```

<!-- v -->

Для Promise:

```ts
function readData(key) {
return Promise.resolve(localstorage.getItem(key));
}

async function readData(key) {
return localstorage.getItem(key);
}
```

<!-- v -->

Документирование API:

- `.d.ts` файлы
- [tsdoc](https://github.com/microsoft/tsdoc)
- тесты

<!-- v -->

Вопросы?