实现 Vuex 无限层级类型推断(TS 4.1 新特性)

本文介绍了如何利用 TypeScript 4.1 的新特性——字符串模板类型,来实现 Vuex 在嵌套情况下的无限层级模块字符串类型推断。通过定义函数骨架、实现 Action、推断 Modules Keys 和单个 Module Keys,逐步解析了如何在调用 Vuex Actions 时获得智能提示。文中提供了一个完整的代码示例,并展示了递归推断无限层级模块的实现过程。
摘要由CSDN通过智能技术生成

前言

前几天,TypeScript 发布了一项 4.1 版本的新特性,字符串模板类型,还没有了解过的小伙伴可以先去这篇看一下:TypeScript 4.1 新特性:字符串模板类型,Vuex 终于有救了?

本文就利用这个特性,简单实现下 Vuex 在 modules 嵌套情况下的 dispatch 字符串类型推断,先看下效果,我们有这样结构的 store

const store = Vuex({
   
  mutations: {
   
    root() {
   },
  },
  modules: {
   
    cart: {
   
      mutations: {
   
        add() {
   },
        remove() {
   },
      },
    },
    user: {
   
      mutations: {
   
        login() {
   },
      },
      modules: {
   
        admin: {
   
          mutations: {
   
            login() {
   },
          },
        },
      },
    },
  },
})

需要实现这样的效果,在 dispatch 的时候可选的 action 字符串类型要可以被提示出来:

store.dispatch('root')
store.dispatch('cart/add')
store.dispatch('user/login')
store.dispatch('user/admin/login')

img

实现

定义函数骨架

首先先定义好 Vuex 这个函数,用两个泛型把 mutationsmodules 通过反向推导给拿到:

type Store<Mutations, Modules> = {
   
  // 下文会实现这个 Action 类型
  dispatch(action: Action<Mutations, Modules>): void
}

type VuexOptions<Mutations, Modules> = {
   
  mutations: Mutations
  modules: Modules
}

declare function Vuex<Mutations, Modules>(
  options: VuexOptions<Mutations, Modules>
): Store<Mutations, Modules>

实现 Action

那么接下来的重点就是实现 dispatch(action: Action): void 中的 Action 了,我们的目标是把他推断成一个 'root' | 'cart/add' | 'user/login' | 'user/admin/login' 这样的联合类型,这样用户在调用 dispatch 的时候,就可以智能提示了。

Action 里首先可以简单的先把 keyof Mutations 拿到,因为根 store 下的 mutations 不需要做任何的拼接,

重头戏在于,我们需要根据 Modules 这个泛型,也就是对应结构:

modules: {
   
   cart: {
   
      mutations: 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值