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

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

vuex-class

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

全部装饰器有:

  • @State

  • @Getter

  • @Action

  • @Mutation

还有一个辅助函数:

  • namesapce  (用得比较少)

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

import Vue from 'vue'import Component from 'vue-class-component'import {
  State,
  Getter,
  Action,
  Mutation,
  namespace
} from 'vuex-class'const ModuleGetter = namespace('path/to/module', Getter) @Component
export class MyComp extends Vue {  // 声明 state,getter, action, mutation等,并手动添加类型
  @State('foo') stateFoo: number 
  @State(state => state.bar) stateBar: string
  @Getter('foo') getterFoo: number  
  @Action('foo') actionFoo: () => void
  @Mutation('foo') mutationFoo: () => void
  @ModuleGetter('foo') moduleGetterFoo: number  // If the argument is omitted, use the property name
  // for each state/getter/action/mutation type
  @State foo
  @Getter bar
  @Action baz
  @Mutation qux   created () {    this.stateFoo // -> store.state.foo
    this.stateBar // -> store.state.bar
    this.getterFoo // -> store.getters.foo
    this.actionFoo({ value: true }) // -> store.dispatch('foo', { value: true })
    this.mutationFoo({ value: true }) // -> store.commit('foo', { value: true })
    this.moduleGetterFoo // -> store.getters['path/to/module/foo']
  }
}

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 声明成自己的类型。

// tsconfig.json
{
  ...
  "paths": {
    "vuex": ["typings/vuex.d.ts"], // 这里
  }
  ...}
// typings/vuex.d.ts import { RootState } from '../src/store';

declare module "vue/types/options" {
  interface ComponentOptions<V extends Vue> {      // 这里声明成自己的类型就行
      store?: Store<RootState>;
  }
} declare module "vue/types/vue" {
  interface Vue {
      $store: Store<RootState>;
  }
}

详细的前因后果,参考 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. 3.流程定义的CRUD

    表 _re_是仓库的简写 /itcast0711/src/main/java/cn/itcast/b_processDefinition/ProcessDefinitionTest.java pack ...

  2. Codeforces 366C Dima and Salad:背包dp

    题目链接:http://codeforces.com/problemset/problem/366/C 题意: 有n个物品,每个物品有两个属性a[i]和b[i]. 给定k,让你选出一些物品,使得 ∑ ...

  3. php设计模式课程---7、装饰器模式如何使用

    php设计模式课程---7.装饰器模式如何使用 一.总结 一句话总结: 装饰器的核心是获取了文章类整个类,而不是获取了文章内容,有了这个文章类,我想给你加多少装饰就给你加多少装饰(将文章这个类封装进去 ...

  4. 分享知识-快乐自己:Java常用API总结

    1):java.io.BufferedReader类(用于从文件中读入一段字符:所属套件:java.io) 1. 构造函数BufferedReader(java.io.FileReader FileR ...

  5. Java微信开发_Exception_01_The type org.xmlpull.v1.XmlPullParser cannot be resolved. It is indirectly referenced from required .class files

    一.源码: package com.souvc.weixin.util; import java.io.InputStream; import java.io.Writer; import java. ...

  6. 使用jquery执行ajax

    $.ajax():返回其创建的XMLHttpRequest对象 回调函数:如果要处理$.ajax()得到的数据,则应该使用回调函数!beforeSend:在发送请求之后调用,需要一个XMLHttpRe ...

  7. 【leetcode刷题笔记】LRU Cache

    Design and implement a data structure for Least Recently Used (LRU) cache. It should support the fol ...

  8. freeMarker(十六)——FAQ

    学习笔记,选自freeMarker中文文档,译自 Email: ddekany at users.sourceforge.net 1.JSP 和 FreeMarker ? 我们比较 FreeMarke ...

  9. oracle隐含参数的查看与修改

    v$parameter视图中查询参数的时候其实都是通过x$ksppi和x$ksppcv这两个内部视图中得到的. 1.   可以通过如下方式查询当前实例的所有隐含参数: col name for a30 ...

  10. pycharm安装 package报错:module 'pip' has no attribute 'main'

    转自: <pycharm安装 package报错:module 'pip' has no attribute 'main'> https://www.cnblogs.com/Fordest ...