«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > jsDoc модуль npm квест

jsDoc модуль npm квест

Опубликовано 2 ноября 2024 г.
Просматривать:364

jsDoc npm module quest

В настоящее время я работаю/поддерживаю устаревшие приложения js/react, где нет возможности переработать их в typeript, поэтому я включаю jsDoc как существующую систему типов времени разработки для JS.

TLDR;

Модуль Typescript npm создан jsDoc, useDuck возвращает золотой век Redux под 70LOC. Этот модуль является основным вариантом использования во время разработки, когда помогает вашему сложному состоянию оставаться типобезопасным.

const [state, quack] = useDuck(reducer, initialState, actionsMap);

jsdoc-утка

Дорога от машинописного текста к jsDoc

Мой опыт работы с машинописным текстом углубился, когда я создал облегченную библиотеку npm для реагирования на состояние: response-state-factory

User declared 
state and actions types 
  -> useStateFactory 
  -> [state, dispatchedActoionCollection]

Тестирование ограничений jsDoc

После того, как я начал использовать несколько аннотаций jsDoc для облегчения своих работ, следующий шаг был немного более амбициозным: переработать этот модуль в jsDoc. На первый взгляд это невыполнимая миссия. Но после нескольких недель, потраченных на понимание jsDoc, я увидел некоторый свет в конце туннеля.

Ужас системы типов: редуктор

В какой-то момент я обнаружил жесткое ограничение возможностей jsDoc: когда я пытаюсь написать функцию редуктора, результатом является шарлатанство, но, конечно же, она запускает пустой {}. Таким образом, только в конце запуска редуктора создается правильный Quack, потому что этот тип интересуется, содержит ли объект весь запрошенный ключ. Итак, эту проблему до сих пор я не могу решить. Если кто-нибудь может дать хорошую идею, как я могу ее решить, поделитесь со мной или присоединитесь к разработке этого модуля в качестве соавтора.

Еще одна ловушка: в модуле без TS нет типов.

Сначала я создаю один js-файл, содержащий все необходимые jsDoc @typedef, рано или поздно это заработает. И в этот момент я думаю, что это всего лишь один шаг, чтобы создать для них модуль узла.
Но печальный факт: модуль npm, содержащий экспортированные типы, не работает только с jsDoc, поэтому обязательно скомпилировать d.ts, чтобы в конце модуля jsDoc не указывали 100% JS, вместо этого при сборке также используется машинописный текст.

@typedef в модуле jsdoc-duck

Как вы заметили на форуме dev.to, подсветка синтаксиса не распознает jsDoc. Другие неправильные вещи: @typedef в моем тесте просто работает, если вы пишете одну строку, и это противоречит чистому коду.

В моем следующем сообщении в блоге я напишу конкретный вариант использования этой библиотеки: сортировка: упрощение и типизация обработки состояния реагирования с помощью useReducer.

/**
 * @template T - Payload Type
 * @typedef {T extends { type: infer U, payload?: infer P } ? { type: U, payload?: P } : never} ActionType
 */

// @ts-ignore
/** @template AM - Actions Map @typedef {{ [K in AM['type']]: K }} Labels */

// @ts-ignore
/** @template AM - Actions Map @typedef {{ [T in AM["type"]]: Extract extends { payload: infer P } ? (payload: P) => void : () => void }} Quack */

/**
 * @template ST - State
 * @template AM - Actions Map
 * @typedef {(state: ST, action: AM) => ST} Reducer
 */
Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/pengeszikra/jsdoc-npm-module-quest-2f7a?1. Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить их.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3