Отчасти привлекательность Vuex как библиотеки управления состоянием заключается в ее простоте, легкости внедрения и гибкости.

Как и в случае с Vue, вы можете зайти так далеко, как захотите. Разместите ссылку CDN на странице и используйте глобальные переменные? Конечно. Сделать типобезопасным? Конечно.

К сожалению для пользователей Typescript, Vuex из коробки не обеспечивает безопасность типов. Рекомендуемый метод диспетчеризации действий, фиксации мутаций и доступа к геттерам основан на сопоставлении строк и произвольных ссылках на ключи объектов.

Например, в большинстве приложений Vue компоненты, подключенные к магазину, вероятно, выглядят примерно так:

export default {
  emitAction() {
    this.$store.dispatch("actionName", { actionPayload: "OK" });
  }
  computed: {
    getStoreValues() {
      return this.$store.getters.storeValues;
    }
  }
}

Это вводит некоторые проблемы в области машинописных текстов ...

А именно, «свойство $ store не существует для типа this».

Вы всегда можете заставить компилятор разрешить это, приведя «this» к «any», но ...

С таким же успехом вы можете не писать Typescript.

Введите, vuex-typex,

Vuex-typex - это небольшая библиотека, которая представляет твердый шаблон для написания хранилищ Vuex в Typescript.

Основной метод, экспортируемый из vuex-typex, - это getStoreBuilder. Этот метод делает несколько вещей, а именно:

  • Регистрирует действия, мутации и геттеры в вашем глобально доступном магазине.
  • Возвращает типизированную версию действия, мутации или метода получения, которые будут использоваться в вашем приложении.

Что оно делает

Внутри вы по-прежнему получаете доступ к методам Vuex с помощью строковых литералов и произвольных объектных ключей; НО, вы экспортируете типобезопасные функции в файлы Typescript.

Думайте о библиотеке как о адаптере между вашим динамически типизированным хранилищем Vuex и вашим статически типизированным проектом Typescript.

Например, в приведенном ниже надуманном примере -

import { getStoreBuilder } from 'vuex-typex' 
import { ActionContext } from 'vuex';
import { RootState } from './RootState' // Typed root state
import ApiClient from './../ApiClient';
// Typed initial state of this module 
type UserModule = { username: string };
const initialState: UserModule = { username: "" };
const userModule = getStoreBuilder<RootState>("userModule",
initialState);
function loginUser(context: ActionContext<UserModule, RootState>, payload: { username: string }) { 
  return ApiClient.login(username).then((resp) => resp.data);
}
const user = {
  dispatchLoginUser: userModule.read(loginUser)
};
export default user;

Дает вам полную безопасность типов, импортированную в другой модуль:

Это отличная новость для пользователей Typescript, которые все еще хотят использовать Vuex.

Где я могу зарегистрироваться?

Лучший источник информации о проекте - это Github. Там автор приводит пример полнофункционального хранилища Vuex, написанного на Typescript.

Спасибо, что читаете блог Front-End Society! Садитесь в этот поезд пораньше и добавьте наш сайт в закладки. Кроме того, вы можете подписаться на меня в Twitter.