Node.js Recipes
3.23K subscribers
174 photos
7 videos
1 file
622 links
По буднях нотатки по #Nodejs розробці, по вихідним огляди конференцій та доповідей (с) @galkin_nikita
Download Telegram
Какие директивы есть в TypeScript и зачем их использовать?
#typescript

Директива это комментарий, который говорит TypeScript компилятору изменить свое поведение. Существуют Triple-Slash Directives, которые выходят за рамки этого рецепта. Их использование оправдано при создание библиотек, но не приложений.

Сегодня же речь об директивах начинающихся@ts-. На текущий момента, в версии TypeScript 4.2, их существует 4:
➡️ // @ts-check – применяется только в начале javascript файла. Используется в ходе перехода с JS на TS. Для typescript файлов не применим.
➡️ // @ts-nocheck – применяется только в начале файла. Все ошибки в файле будут проигнорированы. Используется и в JS, и в TS. Рекомендован в случае перехода на TS.
➡️ // @ts-ignore – возможная ошибка на следующей строке будет проигнорирована.
➡️ // @ts-expect-error – ошибка на следующей строке будет проигнорирована. Если ошибки нет, то TypeScript компилятор выкинет ошибку Unused '@ts-expect-error' directive. Использование предпочтительней, чем @ts-ignore.

Каноническим примером использования @ts-expect-error является обращение к приватному свойству в unit тесте.

Тут можно прочитать рекомендацию, что в каком случае использовать @ts-expect-error или @ts-ignore. Выработанную договоренность лучше закрепить на уровне линтинга с помощью @typescript-eslint/ban-ts-comment.
Что такое AssemblyScript?
#typescript

Универсальный способ оптимизации производительности для JavaScript разработчика это перенос вычислений в WebAssembly. Упрощенно говоря это значит написать требуемый код на C++ или его аналогах.

AssemblyScript решает проблему "мне нужен WASM, но нет ресурсов чтобы изучить новый язык". По сути AssemblyScript это тот же TypeScript с WASM типами и уже настроенным компилятором. Это решение хорошо тем, что подойдет и для Node.js, и для браузера.

Для большинства проектов это решение будет over-engineering, но там где есть CPU intensive задачи я рекомендую это решение.
Как писать меньше TypeScript интерфейсов?
#typescript

TL;DR Используйте Lookup Types

TypeScript позволяет писать вложенные интерфейсы. Например:

interface User {
id: number;
name: string;
contacts: {
phone: string;
email: string;
address: {
country: string;
city: string;
street: string;
}
}
}

Необходимо создать функцию updateUserContact. Распространённое решение вынести UserСontact как отдельный интерфейс, или еще хуже продублировать его. Новый интерфейс использовать как тип в функции.
Вместо этого следует использовать  Lookup Types. Это выглядит так:
type UserСontacts = User['contacts']
type UserAddress = User['contacts']['address']

Обратите внимание, что всегда используются квадратные скобки и кавычки, а не точка. Такая нотация позволяет делать union внутри квадратных скобок или использовать keyof. В завершение пример близкий к продакшен коду:

function updateUserContact<T extends keyof User["contacts"]>(
user: User,
contactType: T,
contact: User["contacts"][T]
): void {
// ...
}
Как следить за устареванием кода?
#nodejs_api #typescript

В разработке существует жизненный цикл. Вы можете увидеть его этапы в #nodejs документации в виде stability index. Часть методов помечена как Legacy, т.е. их не стоит использовать как прямо, так и через библиотеки. Аналогичный подход можно использовать в своей кодовой базе. Для этого следует использовать JSdoc @deprecated. Пример:
/** @deprecated use newFunction instead **/
function oldFunction() {...}

Проверку использования устаревшего кода можно переложить на eslint. Для javascript проектов для этого используется правило import/no-deprecated.

В typescript есть перегрузка функций и устареть может только часть сигнатур. Пример:
function example(userOrId: User): void
/** @deprecated use with User instead of user_id **/
function example(userOrId: number): void
Поэтому для typescript проектов следует использовать eslint-plugin-deprecation.
Как подтянуть TypeScript?
#typescript #code_pattern

Лучший способ тренировки паттернов кодирование это решений задач. Для этого отлично подойдет проект type-challenges. Каждая из задач предлагает написать свой тип. Есть встроенная проверка. Как это работает можно глянуть на Hello World примере.

В Readme проекта задачи отсортированы по темам и уровням сложности. Некоторые задачи начального уровня предлагают реализовать built-in тип, т.е. который уже есть в TypeScript.