使用 typescript ,提升 vue 项目的开发体验(2)
此文已由作者张汉锐授权网易云社区发布。
欢迎访问网易云社区,了解更多网易技术产品运营经验。
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)的更多相关文章
- 使用 typescript ,提升 vue 项目的开发体验(1)
此文已由作者张汉锐授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 前言:对于我们而言,typescript 更像一个工具 官方指南 从 vue2.5 之后,vue 对 ts ...
- TypeScript编写Vue项目结构解析
使用TypeScript编写Vue项目也已经有了一段时间,笔者在刚刚使用TypeScript时候也是很茫然,不知道从何下手,感觉使用TypeScript写项目感觉很累赘并不像JavaScript那么灵 ...
- vue项目的开发
vue项目的开发 我们已经通过命令行创建了一个vue项目,并且打开了这个项目.下面是这个文件的src文件夹,这个文件夹放了整个项目的核心代码. 一.vue文件的用处简介. 1.assets文件夹,用来 ...
- 如何加快Vue项目的开发速度
如何加快Vue项目的开发速度 本文摘自奇舞周刊,侵权删. 现如今的开发,比如内部使用的管理平台这种项目大都时间比较仓促.实际上来说,在使用了webpack + vue 这一套来开发的话已经大大了提高了 ...
- 基于Typescript的Vue项目配置国际化
基于Typescript的Vue项目配置国际化 简介 使用vue-i18n插件对基于Typescript的vue项目配置国际化,切换多种语言, 配合element-ui或者其他UI库 本文以配置中英文 ...
- 教你搭建基于typescript的vue项目
自尤大去年9月推出vue对typescript的支持后,一直想开箱尝试,对于前端sr来说,vue的顺滑加上ts的面向对象,想着就非常美好~ 终于在两个月前,找到了个机会尝试了一把vue+ts的组合. ...
- 手动搭建webpack + vue项目之初体验
在使用vue做开发时,大部分人只会使用官方提供的脚手架搭建项目,脚手架虽然很好用,但想要成为一名优秀的前端开发者,webpack这一道坎是绕不开的,所以我们要学会脱离脚手架,利用webpack手动搭建 ...
- 使用TypeScript创建Vue项目
Vue的灵活性总是让代码看起来非常洗练,对TypeScript来说也是一种挑战, 好在Vue对TypeScript进行了一次全方位的适配. 相对于React严谨的代码,Redux啰嗦的样板代码,Vue ...
- 加快Vue项目的开发速度
巧用Webpack Webpack是实现我们前端项目工程化的基础,但其实她的用处远不仅仅如此,我们可以通过Webpack来帮我们做一些自动化的事情.首先我们要了解require.context()这个 ...
随机推荐
- Spark- Transformation实战
RDD的算子分为两类,是 Trans formation(Lazy),一类是 Action(触发任务执行RDD不存在真正要计算的数据,而是记录了RDD的转换关系(调用了什么方法,传入什么函数) RDD ...
- python Tkinter之Button
Button小部件是一个标准的Tkinter的部件,用于实现各种按钮.按钮可以包含文本或图像,您可以调用Python函数或方法用于每个按钮. Tkinter的按钮被按下时,会自动调用该函数或方法. 该 ...
- artdialog插件--iframe穿透特性
使用artdialog可以实现嵌套页面间的通信. 一.引入插件 //artdialog是建立在jquery上面的所以要首先引入jquery <script src="__CLASSTP ...
- 解决Eclipse和myeclipse在进行 html,jsp等 页面编辑时,自动格式化变丑的问题
在eclipse和myelipse写JAVA代码时中使用ctrl+shift+f 快捷键自动排版省时又省力,排版后的代码规范美观又层次性,但在我们写jsp或html代码时,使用这个快捷键排版简直奇丑无 ...
- 原生js监听input值改变事件
哈哈哈,又来了,今天闲来无事,实验了下原生js监听input value值改变事件,下面就来说道说道: 本来写监听input值便获是用jquery的,之前的随笔写了,就是这个方法,地址:http:// ...
- Gym - 100801G: Graph (贪心+set+拓扑)(好题)
题意:给定一个N点M边的有向图,叫你加最多K条边,使得最小拓扑序最大. 思路:不是那么简单的题. 参照了别人的代码, 最后想通了. 贪心原则: 用两个单调队列维护, 第一个序列S1单增, 表示当前入 ...
- #include <deque>
deque \(deque\)头文件主要包括一个双端队列容器.是一个支持在两端插入两端删除的线性储存空间,与vector和queue相似.与\(vector\)比起来,\(deque\)可以在\(O( ...
- C#SqlDataReader的用法
string sqljn = "select [序号],[品名],[电压等级],[单位],[型号],[规格],[红本价格] FROM [book].[dbo].[View_wjprice]& ...
- 【转】Pro Android学习笔记(十三):用户界面和控制(1):UI开发
目录(?)[-] UI开发 方式一通过XML文件 方式二通过代码 方式三XML代码 UI开发 先理清一些UI概念: view.widget.control:这三个名词其实没有什么区别,都是一个UI元素 ...
- EventLoop 与 Channel 的关联
Netty 中, 每个 Channel 都有且仅有一个 EventLoop 与之关联, 它们的关联过程如下: 从上图中我们可以看到, 当调用了 AbstractChannel#AbstractUnsa ...