vuex4 到底怎么优雅的与 typescript 结合使用? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
daguaochengtang
V2EX    问与答

vuex4 到底怎么优雅的与 typescript 结合使用?

  •  < href="Javascript:" Onclick="downVoteTopic(757310);" class="vote">
  •   daguaochengtang 2021-03-01 15:52:37 +08:00 2075 次点击
    这是一个创建于 1684 天前的主题,其中的信息可能已经有所发展或是发生改变。
    首先排除装饰器写法,个人偏见,实在不喜欢

    然后我看了下网上不不使用装饰器的写法,当用到 modules 的时候,那个类型定义,真实恶心到我了。贴个代码片段吧,比如我有一个 app module,这个模块 Store 的类型定义大致长下面这样,这玩意真是给碳基生物用的吗?能看懂,但是代码真实又臭又长。

    ```
    export type AppStore<S = AppState> = Omit<VuexStore<S>, 'getters' | 'commit' | 'dispatch'>
    & {
    commit<K extends keyof Mutations, P extends Parameters<Mutations[K]>[1]>(
    key: K,
    payload: P,
    options?: CommitOptions
    ): ReturnType<Mutations[K]>
    } & {
    dispatch<K extends keyof Actions>(
    key: K,
    payload: Parameters<Actions[K]>[1],
    options?: DispatchOptions
    ): ReturnType<Actions[K]>
    };
    ```

    所以,现在 vuex4 的现状就是不用装饰器写 ts 就必须写这样又臭又长的类型声明吗?还是说有其它优雅使用方式,但是我不知道?欢迎拍砖
    11 条回复    2021-03-02 13:18:06 +08:00
    iikebug
        1
    iikebug  
       2021-03-01 16:32:27 +08:00
    可以考虑自己实现个轻量级的状态管理工具
    murmur
        2
    murmur  
       2021-03-01 16:42:55 +08:00
    我记得 vuex 非常简单啊,一个文件就可以搞定状态管理,比 redux 简单多了,为啥这么复杂
    shakaraka
        3
    shakaraka  
    PRO
       2021-03-01 16:44:44 +08:00
    最近也是在看 vue3 的 ts 源码,,,类型定义真的乱。。。和 ng 不是一个级别的
    daguaochengtang
        4
    daguaochengtang  
    OP
       2021-03-01 17:02:47 +08:00
    @murmur typescript 的类型声明啊
    murmur
        5
    murmur  
       2021-03-01 17:04:44 +08:00
    @daguaochengtang vuex 最简单的时候只需要一个文件,里面写 state 和 mutation,其余的都不需要,也不要求不可变对象,为什么会有这么复杂的表述

    描述复杂不代表要写起来复杂啊
    daguaochengtang
        6
    daguaochengtang  
    OP
       2021-03-01 17:09:57 +08:00
    @murmur 应该是为了 ts 的类型提示
    ruoxie
        7
    ruoxie  
       2021-03-01 17:30:00 +08:00
    为什么还要用 vuex,直接 hooks
    daguaochengtang
        8
    daguaochengtang  
    OP
       2021-03-01 17:49:21 +08:00
    @ruoxie 看过说 vue3 不需要 vuex 直接用 hooks 的,但是 hooks 貌似只能用在 setup 里吧,我如果想在其它地方用呢?比如 vuex 我可以在 axios 的 request 拦截器里引入 store,使用 store.user.state.token,你用 hooks 怎么实现呢?
    ruoxie
        9
    ruoxie  
       2021-03-01 19:07:38 +08:00
    @daguaochengtang

    import { reactive } from 'vue';

    const user = reactive<{ name: boolean,token:string, }>({
    name: false,
    token:''
    });

    export function getToken(){
    return user.token
    }

    export default function useUserInfo() {
    ...
    return {
    user
    };
    }

    当然你可以粗暴一点,直接把 user export 出去
    varzy
        10
    varzy  
       2021-03-02 08:56:46 +08:00 via iPhone
    同意。vue 全家桶用了三年,结果前段时间想用 vue3 + ts 这套东西写个 demo 练手,愣是在 vuex4 +ts 这卡的无从下手。。。
    daguaochengtang
        11
    daguaochengtang  
    OP
       2021-03-02 13:18:06 +08:00
    @varzy 真是恶心,究其原因还是 vuex 在设计阶段就没考虑到 ts 支持,vuex4 也只是在原来的源码基础上向外暴露了一些 type,源码依然是 js 写的,想愉快的用 ts 写 vuex 估计要等 vuex5 了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1025 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 18:32 PVG 02:32 LAX 11:32 JFK 14:32
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86