Какие директивы есть в TypeScript и зачем их использовать?
#typescript
Директива это комментарий, который говорит TypeScript компилятору изменить свое поведение. Существуют Triple-Slash Directives, которые выходят за рамки этого рецепта. Их использование оправдано при создание библиотек, но не приложений.
Сегодня же речь об директивах начинающихся
➡️
➡️
➡️
➡️
Каноническим примером использования @ts-expect-error является обращение к приватному свойству в unit тесте.
Тут можно прочитать рекомендацию, что в каком случае использовать @ts-expect-error или @ts-ignore. Выработанную договоренность лучше закрепить на уровне линтинга с помощью @typescript-eslint/ban-ts-comment.
#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 решает проблему "
Для большинства проектов это решение будет over-engineering, но там где есть CPU intensive задачи я рекомендую это решение.
#typescript
Универсальный способ оптимизации производительности для JavaScript разработчика это перенос вычислений в WebAssembly. Упрощенно говоря это значит написать требуемый код на C++ или его аналогах.
AssemblyScript решает проблему "
мне нужен WASM, но нет ресурсов чтобы изучить новый язык". По сути AssemblyScript это тот же TypeScript с WASM типами и уже настроенным компилятором. Это решение хорошо тем, что подойдет и для Node.js, и для браузера.Для большинства проектов это решение будет over-engineering, но там где есть CPU intensive задачи я рекомендую это решение.
Как писать меньше TypeScript интерфейсов?
#typescript
TL;DR Используйте Lookup Types
TypeScript позволяет писать вложенные интерфейсы. Например:
Необходимо создать функцию
Вместо этого следует использовать Lookup Types. Это выглядит так:
Обратите внимание, что всегда используются квадратные скобки и кавычки, а не точка. Такая нотация позволяет делать
#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 {// ...}www.typescriptlang.org
Documentation - TypeScript 2.1
TypeScript 2.1 Release Notes
Как следить за устареванием кода?
#nodejs_api #typescript
В разработке существует жизненный цикл. Вы можете увидеть его этапы в #nodejs документации в виде stability index. Часть методов помечена как Legacy, т.е. их не стоит использовать как прямо, так и через библиотеки. Аналогичный подход можно использовать в своей кодовой базе. Для этого следует использовать JSdoc
Проверку использования устаревшего кода можно переложить на eslint. Для javascript проектов для этого используется правило import/no-deprecated.
В typescript есть перегрузка функций и устареть может только часть сигнатур. Пример:
Поэтому для typescript проектов следует использовать eslint-plugin-deprecation.
#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.
#typescript #code_pattern
Лучший способ тренировки паттернов кодирование это решений задач. Для этого отлично подойдет проект type-challenges. Каждая из задач предлагает написать свой тип. Есть встроенная проверка. Как это работает можно глянуть на Hello World примере.
В Readme проекта задачи отсортированы по темам и уровням сложности. Некоторые задачи начального уровня предлагают реализовать built-in тип, т.е. который уже есть в TypeScript.
GitHub
GitHub - type-challenges/type-challenges: Collection of TypeScript type challenges with online judge
Collection of TypeScript type challenges with online judge - type-challenges/type-challenges