此文已由作者张汉锐授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验。

vuex-class

提供了和 vuex 相关的全部装饰器,从而解决了上面 Vue.extend + vuex 的 「代码提示」「代码重构」两个问题,然后再通过手动添加类型声明,使得「类型检查」的工作也能生效

全部装饰器有:

  • @State

  • @Getter

  • @Action

  • @Mutation

还有一个辅助函数:

  • namesapce  (用得比较少)

具体用法也很明确,看例子:

  1. import Vue from 'vue'import Component from 'vue-class-component'import {
  2.   State,
  3.   Getter,
  4.   Action,
  5.   Mutation,
  6.   namespace
  7. } from 'vuex-class'const ModuleGetter = namespace('path/to/module', Getter)
  8.  
  9. @Component
  10. export class MyComp extends Vue {  // 声明 state,getter, action, mutation等,并手动添加类型
  11.   @State('foo') stateFoo: number 
  12.   @State(state => state.bar) stateBar: string
  13.   @Getter('foo') getterFoo: number  
  14.   @Action('foo') actionFoo: () => void
  15.   @Mutation('foo') mutationFoo: () => void
  16.   @ModuleGetter('foo') moduleGetterFoo: number  // If the argument is omitted, use the property name
  17.   // for each state/getter/action/mutation type
  18.   @State foo
  19.   @Getter bar
  20.   @Action baz
  21.   @Mutation qux
  22.  
  23.   created () {    this.stateFoo // -> store.state.foo
  24.     this.stateBar // -> store.state.bar
  25.     this.getterFoo // -> store.getters.foo
  26.     this.actionFoo({ value: true }) // -> store.dispatch('foo', { value: true })
  27.     this.mutationFoo({ value: true }) // -> store.commit('foo', { value: true })
  28.     this.moduleGetterFoo // -> store.getters['path/to/module/foo']
  29.   }
  30. }

vue-mixin

这个库提供的装饰器,专门用于处理 vue 使用 mixin 的情况。装饰器如下:

  • @Mixin

  • @Mixins

  • @Component : 对 vue-class-component 的封装。在结合 vue-class-component 的时候,请使用这个 component

按照文档的例子,看下面 gif

另外,也支持多个 mixin ,详情查看文档介绍 vue-mixin-decorator

小结

介绍到这里,通过加入几个装饰器,已经能够保证 vue + ts 有了最基础的开发体验了。

虽然代码形式上有很大的变化,实际上还是 vue 的模样(穿了马甲,23333)。

其他:插件类型声明, Store.state 类型声明

插件类型声明

vue 文档在 typescript 那一节已经有介绍,这里就不再介绍,看 gif 吧

Store.state

为了更好的开发体验,在访问 this.$store.state 的时候有代码提示和类型检查。目前版本(3.0.1) vuex 的类型声明还不允许这么做,需要 hack 下才能实现。

具体的 hack 方式是,通过  tsconfig.json 屏蔽官方的 vuex.d.ts 文件,拷贝一份到 typings/vuex.d.ts,然后对 vuex 的 Store 声明成自己的类型。

  1. // tsconfig.json
  2. {
  3.   ...
  4.   "paths": {
  5.     "vuex": ["typings/vuex.d.ts"], // 这里
  6.   }
  7.   ...}
  1. // typings/vuex.d.ts import { RootState } from '../src/store';
  2.  
  3. declare module "vue/types/options" {
  4.   interface ComponentOptions<extends Vue> {      // 这里声明成自己的类型就行
  5.       store?: Store<RootState>;
  6.   }
  7. }
  8.  
  9. declare module "vue/types/vue" {
  10.   interface Vue {
  11.       $store: Store<RootState>;
  12.   }
  13. }

详细的前因后果,参考 Write Stores in Typescript  的讨论

总结

到这里,基本上 vue + ts 的体验就会非常的好了,能够利用到「代码提示」「类型检查」「代码重构」等非常便利的工具,代码质量会在一定程度上有提升。期望在 vue 未来的版本上,能够对 ts 有更好的支持,使得在 vue 全家桶和 ts 集成的时候,成本更低。

免费体验云安全(易盾)内容安全、验证码等服务

更多网易技术、产品、运营经验分享请点击

相关文章:
【推荐】 数据库路由中间件MyCat - 源代码篇(1)
【推荐】 Omad群组部署、依赖部署一键解决
【推荐】 客户端SDK测试思路

使用 typescript ,提升 vue 项目的开发体验(2)的更多相关文章

  1. 使用 typescript ,提升 vue 项目的开发体验(1)

    此文已由作者张汉锐授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 前言:对于我们而言,typescript 更像一个工具 官方指南 从 vue2.5 之后,vue 对 ts ...

  2. TypeScript编写Vue项目结构解析

    使用TypeScript编写Vue项目也已经有了一段时间,笔者在刚刚使用TypeScript时候也是很茫然,不知道从何下手,感觉使用TypeScript写项目感觉很累赘并不像JavaScript那么灵 ...

  3. vue项目的开发

    vue项目的开发 我们已经通过命令行创建了一个vue项目,并且打开了这个项目.下面是这个文件的src文件夹,这个文件夹放了整个项目的核心代码. 一.vue文件的用处简介. 1.assets文件夹,用来 ...

  4. 如何加快Vue项目的开发速度

    如何加快Vue项目的开发速度 本文摘自奇舞周刊,侵权删. 现如今的开发,比如内部使用的管理平台这种项目大都时间比较仓促.实际上来说,在使用了webpack + vue 这一套来开发的话已经大大了提高了 ...

  5. 基于Typescript的Vue项目配置国际化

    基于Typescript的Vue项目配置国际化 简介 使用vue-i18n插件对基于Typescript的vue项目配置国际化,切换多种语言, 配合element-ui或者其他UI库 本文以配置中英文 ...

  6. 教你搭建基于typescript的vue项目

    自尤大去年9月推出vue对typescript的支持后,一直想开箱尝试,对于前端sr来说,vue的顺滑加上ts的面向对象,想着就非常美好~ 终于在两个月前,找到了个机会尝试了一把vue+ts的组合. ...

  7. 手动搭建webpack + vue项目之初体验

    在使用vue做开发时,大部分人只会使用官方提供的脚手架搭建项目,脚手架虽然很好用,但想要成为一名优秀的前端开发者,webpack这一道坎是绕不开的,所以我们要学会脱离脚手架,利用webpack手动搭建 ...

  8. 使用TypeScript创建Vue项目

    Vue的灵活性总是让代码看起来非常洗练,对TypeScript来说也是一种挑战, 好在Vue对TypeScript进行了一次全方位的适配. 相对于React严谨的代码,Redux啰嗦的样板代码,Vue ...

  9. 加快Vue项目的开发速度

    巧用Webpack Webpack是实现我们前端项目工程化的基础,但其实她的用处远不仅仅如此,我们可以通过Webpack来帮我们做一些自动化的事情.首先我们要了解require.context()这个 ...

随机推荐

  1. 分布式系统的Raft算法——在失联阶段这个老Leader的任何更新都不能算commit,都回滚,接受新的Leader的新的更新 意味着还是可能丢数据!!!

    过去, Paxos一直是分布式协议的标准,但是Paxos难于理解,更难以实现,Google的分布式锁系统Chubby作为Paxos实现曾经遭遇到很多坑. 来自Stanford的新的分布式协议研究称为R ...

  2. django-pagination分页

    1. 将该APP安装至Django项目中.(settings.py) INSTALLED_APPS = ( # ... 'pagination', ) 2. 在Django项目的middleware中 ...

  3. Tomcat_异常_01_Setting property 'source' to 'org.eclipse.jst.jee.server:AWeiXin_QiYe_Demo' did not find a matching property

    关于解决方法: 1.解决Setting property 'source' to 'org.eclipse.jst.jee.server的问题 2.eclipse中server location为灰色 ...

  4. codeforces 710C C. Magic Odd Square(构造)

    题目链接: C. Magic Odd Square Find an n × n matrix with different numbers from 1 to n2, so the sum in ea ...

  5. Gym 101142 I.Integral Polygons(计算几何)

    题意:给定一个凸包,现在让你连接凸包上两点,把凸包变为两个多边形,满足两个多边形的面积都是整数. 思路:我们知道整点的三角形面积S=叉积/2,则S要么是整数,要么是整数+0.5.那么多边形有多个三角形 ...

  6. Mysql备份脚本python编写

    #!/usr/bin/env python #-*- coding: UTF-8 -*- ####################################################### ...

  7. bzoj 3165: [Heoi2013]Segment 线段树

    题目: Description 要求在平面直角坐标系下维护两个操作: 在平面上加入一条线段.记第i条被插入的线段的标号为i. 给定一个数k,询问与直线 x = k相交的线段中,交点最靠上的线段的编号. ...

  8. NOIp2018集训test-10-16 (bike day2)

    “毕姥爷:今天的题好简单啊,你们怎么考得这么烂啊,如果是noip你们就凉透了啊“ 今天的题难度应该是3.2.1递减的,但是我不知道哪根筋没搭对,平时我最多1h多就弃题了,今天硬生生写了2h20min的 ...

  9. Mybatis新版实践

    配置文件节点顺序 MyBatis的configuration节点需要有顺序,首先是propertes然后是settings,environment... @Param注解参数 对于Mapper接口,如 ...

  10. GSM/GPRS操作示例

    A6(GPRS)  博文转自安信科技: http://wiki.ai-thinker.com/gprs/examples 1.电话接收 相关指令 ATDxxxxx;//xxx为电话号码 示例 打电话 ...