使用 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()这个 ...
随机推荐
- AdobeFlashPlayer.资料
1.chrome 设置 chrome-->设置-->高级-->内容设置-->Flash 2. 3. 4. 5.
- javascript 数组 去重
javascript数组去重有如下 方法: 一) 利用 数组中的 indexOf判断 例如: Array.prototype.unique=function(){ var n=[]; for(var ...
- vps 虚拟机 云服务器
vps :wxmp 03服务器 虚拟主机: 万网免费主机 云服务器:wxmp阿里云
- jQuery与javascript库
[jquery-javascript库] 为了简化javascript的开发,诞生了javascript程序库,他封装了很多预定的对象和实用函数.下面是几种流行的javascript程序库:proto ...
- codeforces 617E E. XOR and Favorite Number(莫队算法)
题目链接: E. XOR and Favorite Number time limit per test 4 seconds memory limit per test 256 megabytes i ...
- Python 爬虫 —— 网页内容解析(lxml)
0. xpath 语法 找到所有 <img src=....> 图像的链接: xpath = './/img/@src' img_urls = html.xpath(xpath) @修饰节 ...
- 【leetcode刷题笔记】Pascal's Triangle II
Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3,Return [1,3, ...
- 本地windows安装memcached服务
1.安装到系统服务中: 在doc中:执行此软件 memcached.exe -d install(如果提示错误,要找到cmd.exe用管理员身份打开) 安装后在,服务里吗就有个服务了,如果没有启动,点 ...
- Gym - 100851G:Generators(人尽皆知但是WA题)
题意:现在有函数,每一项Xi=(A*X(i-1)+B)%C.现在给定N个函数以及K:X0,A,B,C.然你再每个函数选择一个数,使得其和最大,而且不被K整除. X0,A,B,C<=1e3 :K& ...
- protocol 和 delegate
步骤 1.发出协议(在发协议者.h文件 下@interface-@end 上边) @protocol hireOneMaid <NSObject> @required//必须要实现的方法( ...