Использование модулей Vuex 4 в Vue 3 с TypeScript и как исправить циклическую ошибку линтинга зависимостей?

На момент написания этой статьи Vue 3.0 достиг своего первого стабильного v3.0.0 'One Piece ', а Vuex 4 находится в v4. 0.0-beta.4.

К сожалению, пока нет официальных примеров использования модулей Vuex 4 в TypeScript ...

В качестве дополнительного требования я хочу, чтобы состояние модулей, мутации, методы получения и действия сохранялись в их собственных файлах. Это упрощает управление кодом при росте этих модулей.

Мне удалось собрать репозиторий рабочих примеров в Github и Codesandbox.

Используя примеры из этих ресурсов:

Однако еще предстоит решить несколько проблем:

1. Устранение ошибок линтинга цикла зависимостей

В настоящее время набор текста в модулях index.ts, actions.ts и getters.ts зависит от импорта RootState из основного хранилища.

При использовании конфигурации линтинга ESLint Airbnb я сталкиваюсь с такими ошибками линтинга (в настоящее время отключены // eslint-disable-next-line правилами в репо и примере):

Dependency cycle via @/store/modules/profile > eslint(import/no-cycle)

Хотя это, похоже, не влияет на фактическое функционирование магазина (или влияет?), Я хотел бы знать, как преодолеть это, не отключая правило или не используя // eslint-disable-next-line import/no-cycle в этих строках?

Я не пробовал, происходит ли это с конфигурациями линтеров Standard и Prettier, или это связано с правилами Airbnb?

2. Как сделать так, чтобы модуль не работал?

Я попытался настроить модуль профиля без использования каких-либо действий, однако мне не удалось получить права типов.

В настоящее время пример кода включает один тип действия NON_ACTION ...

3. Как правильно использовать параметр модуля namespaced: true и как он влияет на синтаксис использования в компонентах?

В настоящее время хранилище профилей настроено с namespaced: true. В App.vue я демонстрирую это с помощью mapGetters, который принимает имя модуля в качестве первого параметра. Это работает.

Однако в модуле документов нет этой опции, потому что отправка с типом действия больше не работает. Кажется, его нужно использовать с другим вариантом синтаксиса, который мне не удалось найти.

PS. Любые дальнейшие предложения по доработке кода приветствуются в виде комментариев, ответов и запросов на вытягивание!

Обновление 27/09/20: я только что понял, что Intellisense VS Code не показывает информацию о типе для экземпляра магазина после передачи его из функции useStore при использовании внутри компонента. Работает, если импортировано в .ts файл.


person ux.engineer    schedule 26.09.2020    source источник
comment
Вы смотрели это недавнее видео от Kia Kong, создателя vuex, я надеюсь, что это может оказаться полезным   -  person Boussadjra Brahim    schedule 26.09.2020
comment
@ boussadjra-brahim Я смотрел это на конференции, но, возможно, мне не хватало некоторых его частей. Спасибо, что указали, я посмотрел его снова. Итак, в основном мы ждем Vuex 5, но я думаю, что типы TypeScript, которые еще не полностью работают с Vuex 4, в этом случае нормально. Но давайте все же посмотрим, пошел ли кто-то дальше с этими типами, поэтому я попрошу совета у репозитория Vuex.   -  person ux.engineer    schedule 26.09.2020
comment
ux.engineer, с момента вашего вопроса прошло несколько месяцев, не могли бы вы показать вам текущий метод работы с машинописным текстом в Vuex 4?   -  person Gayrat Vlasov    schedule 26.01.2021


Ответы (1)


Я опубликовал пакет, который поможет использовать Vuex 4 с Typescript. Он не идеален, но покрывает 95% проблем, которые у нас были. Любая обратная связь будет оценена.

Для поддержки литерала шаблона требуется TS 4.1+.

https://www.npmjs.com/package/typed-vuex-wrapper

FWIW первоначальная реализация была очень вдохновлена ​​вашим началом работы с модулями, но расширяет ее и поддерживает mapState / mapActions и т. Д. С полностью типизированным доступом. Требуется TS 4.1 для поддержки литерала шаблона, чтобы обеспечить полностью безопасный доступ к пространству имен без магических строк.

person Tim    schedule 12.03.2021
comment
Не могли бы вы подробнее рассказать о том, как использовать этот модуль более точно, мне нужна хорошая оболочка, пока не выйдет vuex 5. - person Komi; 18.05.2021
comment
Я сделал образец имплементации, используя его здесь: github.com/timritzer/typed-vuex-examples Вы в значительной степени просто добавляете дополнительные типы в свои модули (как указано выше), экспортируете тип хранилища, чтобы его можно было использовать везде, а затем используйте оболочку вместо useStore / mapX - person Tim; 28.05.2021