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

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

前言:对于我们而言,typescript 更像一个工具

官方指南

从 vue2.5 之后,vue 对 ts 有更好的支持。根据官方文档,vue 结合 typescript ,有两种书写方式:

Vue.extend

  import Vue from 'vue'const Component = Vue.extend({    // type inference enabled})

Class-style Vue Components

  import Vue from 'vue'import Component from 'vue-class-component'// The @Component decorator indicates the class is a Vue component@Component({    // All component options are allowed in heretemplate: '<button @click="onClick">Click!</button>'})export default class MyComponent extends Vue {    // Initial data can be declared as instance propertiesmessage: string = 'Hello!'// Component methods can be declared as instance methodsonClick (): void {      window.alert(this.message)}}

理想情况下,Vue.extend 的书写方式,是学习成本最低的。在现有写法的基础上,几乎 0 成本的迁移

// 现在常见的写法export default {    // your code }

但「理想丰满,现实骨感」,问题出在:

  • Vue.exend 在和 vuex 和 mixins 结合使用的时候,无法发挥 ts 的作用,vuex 和 mixins 会在项目中大量使用,这个问题不能忽视。

Vue.extend + vuex + mixins 问题的介绍

Vue.extend + vuex 的问题

由于 vuex 使用  mapState, mapActions 等方法的时候,通过字符串形式做映射,这个过程中,丢失了类型信息。下面的 gif 可以看到,整个过程中:

  • 无法做代码提示

  • 无法对对应的 actions  和 state 做类型声明,使得类型检查生效

  • 无法使用重构

显然,如果只有一部分的方法和属性得到了代码提示和类型检查,就是失去了使用 typescript 意义。

在 Vue.extend + vuex 写法下,这个问题暂时没有解决方案。

Vue.extend + mixins 的问题

同样的问题,在 mixin 中定义的方法,不会被 typescript 识别到,下面 gif 可以看到,不仅仅「代码提示」「类型检查」「代码重构」没有工作,甚至因识别不到 test 而报错

Class-Style Components

那么就剩下 Class-Style Components 方案。当然,这个方案需要做额外的工作才能够让「vue 全家桶 + ts」良好的工作。

原理:将属性直接挂载在 class 上,使得 typescript 能够良好的进行「代码提示」和「类型检查」。然后再通过装饰器将属性转成 vue 上的属性。

例如 @Prop, @Watch, @Action 等装饰器,将属性做相应的转换成 props,  watch, mapActions 里面的值,具体后面例子展示。

vue-class-component

这里库提供最基础的 vue 装饰器:@Component 。其他的 vue 装饰器库,都在这个库的基础上做扩展和修改。看看官网的例子:

import Vue from 'vue'import Component from 'vue-class-component'// @Component 会将 MyComponent 中的属性,转换成 vue 对应的属性@Component({  // Vue 所有的属性都可以在这里声明,一般用到的比较少template: '<button @click="onClick">Click!</button>'})
export default class MyComponent extends Vue {  // @Component 将 message 转成成 data message: string = 'Hello!'// @Component 会将这里的 getter 属性,转换成 computedget name(){    return 'anders'}  // @Component 识别到 created 是声明周期关键字,不做处理created(){}  // @Component 识别到 onClick 不是关键字,将它转成 methods  onClick (): void {    window.alert(this.message)}
}

vue-property-decorator

这个库提供了:

  • @Emit

  • @Inject

  • @Model

  • @Prop

  • @Provide

  • @Watch

其中常用的: @Prop,@Watch,@Emit。 看例子:

import { Component, Emit, Inject, Model, Prop, Provide, Vue, Watch } from 'vue-property-decorator'const s = Symbol('baz')@Component
export class MyComponent extends Vue {@Emit()addToCount(n: number){ this.count += n }@Emit('reset')resetCount(){ this.count = 0 }@Prop()propA: number@Prop({ default: 'default value' })propB: string@Prop([String, Boolean])propC: string | boolean@Watch('child')onChildChanged(val: string, oldVal: string) { }@Watch('person', { immediate: true, deep: true })onPersonChanged(val: Person, oldVal: Person) { }
}

上面的使用就相当于:

const s = Symbol('baz')export const MyComponent = Vue.extend({name: 'MyComponent',props: {checked: Boolean,propA: Number,propB: {type: String,      default: 'default value'},propC: [String, Boolean],},methods: {addToCount(n){      this.count += n      this.$emit("add-to-count", n)},resetCount(){      this.count = 0this.$emit("reset")},onChildChanged(val, oldVal) { },onPersonChanged(val, oldVal) { }},watch: {    'child': {handler: 'onChildChanged',immediate: false,deep: false},    'person': {handler: 'onPersonChanged',immediate: true,deep: true}}
})

更加全面的用法参考文档:vue-property-decorator

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

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

相关文章:
【推荐】 年轻设计师如何做好商业设计

使用 typescript ,提升 vue 项目的开发体验(1)相关推荐

  1. Vue项目构建开发入门

    Vue项目构建开发入门 开篇:Vue CLI 3 项目构建基础 大家好,当你点进这个标题,开始阅读本章的时候,说明你对 Vue.js 是充满好奇心和求知欲的.我之前写过一篇文章,这样评价 Vue.js ...

  2. Typescript在Vue项目中的使用

    最近尝试了一下Typescript在Vue项目中的使用,中间遇到了一些问题,把遇到的问题记录一下,以防被忘. 如何让Typescript识别Vue.JSON文件 因为Typescript默认不能识别. ...

  3. [vue] 分析下vue项目本地开发完成后部署到服务器后报404是什么原因呢?

    [vue] 分析下vue项目本地开发完成后部署到服务器后报404是什么原因呢? 1.检查nginx配置,是否正确设置了资源映射条件: 2.检查vue.config.js中是否配置了publicPath ...

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

    加快Vue项目的开发速度 现如今的开发,比如是内部使用的管理平台这种项目大都时间比较仓仓促.实际上来说在使用了webpack + vue 这一套来开发的话已经大大了提高了效率.但是对于我们的开发层面. ...

  5. 用Docker搭建Laravel和Vue项目的开发环境

    在这篇文章中我们将通过Docker在个人本地电脑上构建一个快速.轻量级.不依赖本地电脑所安装的任何开发套件的可复制的Laravel和Vue项目的开发环境(开发环境的所有依赖都安装在Docker构建容器 ...

  6. 浅谈vue项目进阶开发-杂谈1

    写这一篇完全是想把自己平时对vue的使用体验与理解看记录下来,如有错误欢迎指正. 1.router的beforeEach与afterEach钩子函数 在开发vue项目时遇到这样两个问题:第一个问题是用 ...

  7. 如何用 TypeScript 编写 Vue 项目

    TypeScript TypeScript 是 JavaScript 的一个超集,大家可以理解为是 JavaScript 的另一种写法.它可以通过 TypeScript 编译器或 Babel 转译为 ...

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

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

  9. Vue项目区分开发环境问题

    记录背景 在Jenkins持续构建项目时,出现的IP和Port变化的情况. 也考虑到后期会换底层数据库,Redis配置和上传下载路径,可能会随着服务器的不同配置多台不同的环境变量. 所以区分一下各自开 ...

最新文章

  1. MVC系列——一个异常消息传递引发的思考
  2. java和php设置的cookies_php带cookie访问下载文件 header设置
  3. Interview:人工智能大数据岗位面试—【数据分析师】的简介、技能、待遇、进阶的详细攻略
  4. 详细解读CSS链接属性——Web前端系列学习笔记
  5. ContextLoaderListener.contextInitialized - how is WebApplicationContext created
  6. Ubuntu 16.04安装教程及虚拟机设置
  7. PHP js 点击按钮 切换模版,javascript点击按钮实现隐藏显示切换效果_javascript技巧...
  8. 中国电信叫停不限量套餐 套外资费3元/GB
  9. 导航类查询词的收集方法
  10. Python获取局域网内所有机器IP地址与网卡MAC地址
  11. LeetCode(876)——链表的中间结点(JavaScript)
  12. PyTorch 学习笔记(五):Finetune和各层定制学习率
  13. Haproxy+Nginx实现web负载均衡群集
  14. OpenCV与AIPCV库——学习笔记(一)
  15. AcWing 796. 子矩阵的和
  16. 高中计算机评课,高二信息技术评课记录
  17. VMware vSphere Client5.0与 Windows8不再有问题,解决VMware 5.0 客户端提示VMRC控制台的连接已断开
  18. 两个实用的C语言工具———编程学习必备篇
  19. 微信小程序如何保存图片到相册
  20. win7与internet时间同步出错_win7系统同步internet时间总提示“同步时出错”的解决方法...

热门文章

  1. python多线程为什么要用队列_Python程序中的线程操作-线程队列
  2. 电脑声音太小如何增强_感觉手机音量太小了?教你这样设置,声音立马大上许多...
  3. JQ 取CHECKBOX选中项值
  4. 从零认识单片机(9)
  5. 基于Docker的GoldenGate部署
  6. SDOI2010 地精部落
  7. SAM4E单片机之旅——13、LCD之ASF初步
  8. Android之Menu动态改变文字
  9. iview组件库 - 穿梭栏设置
  10. javaScript第三天(1)