最近尝试了一下Typescript在Vue项目中的使用,中间遇到了一些问题,把遇到的问题记录一下,以防被忘。

如何让Typescript识别Vue、JSON文件

因为Typescript默认不能识别.vue文件,导致在引用.vue文件时,提示加载错误。所以需要自己新建一个 .d.ts 文件添加以下内容。这告诉Typescript以.Vue结尾的导入的任何东西都与Vue构造函数本身具有相同的形状。

// *.d.ts
declare module "*.vue" {import Vue from "vue";export default Vue;
}
复制代码

另外在项目中难免会使用到一些 .json 配置文件,在引用时同样因为Typescript不能识别,同样也需要自己在 *.d.ts 文件声明。

// .d.ts
declare module "*.json" {const value: any;export default value;
}
复制代码

需要注意的时,这些 .d.ts 文件不能放到项目运行入口文件上级目录,否则Typescript没找到这些声明,导致不能正确识别文件类型。

使用装饰器定义组件

在Vue项目中使用Typescript,定义.vue文件一般使用类似React的Class 形式,所以这里只记录一下在 Class 这种形式的写法。使用这种方式需要使用装饰器来定义组件,这需要额外的两个包 vue-class-component 和 vue-property-decorator,其中vue-property-decorator依赖vue-class-component。这2个包可以让我们使用装饰器来定义组件的方法、属性、watch等内容。

在vue-class-decorator中提供了@Emit、@Inject、Mixins、@Model、@Prop、@Provide、@Watch、@Component,8种装饰器,具体使用方法这里不做过多介绍,具体请看这里。其中Mixins、@Component继承于vue-class-component。

Computed、Data、Methods

这里取消了组件的data和methods属性,以往data返回对象中的属性、methods中的方法需要直接定义在Class中,当做类的属性和方法。

@Component
export default class HelloDecorator extends Vue {count: number = 123increment() {// xxxx}
}
复制代码

Computed在这里也被取消,变成了带有get和set的类方法。

@Component
export default class HelloDecorator extends Vue {count: number = 123// 获取计算属性get total(): number {return this.count + 1}// 设置计算属性set total(param:number): void {this.count = param}
}
复制代码

@Component(继承自vue-class-component)

Component装饰器它注明了此类为一个Vue组件,因此即使没有设置选项也不能省略。如果需要定义比如 name、components、filters、directives以及自定义属性,就可以在Component装饰器中定义。

@Component({name: 'xComponent',pageName: 'page title', // 自定义属性components: {// xxxx},filters: {// xxxx},directives: {// xxxx}
})
export default class HelloDecorator extends Vue {
}
复制代码

关于组件名,如果不设置name属性,组件名将使用类名。优先级: name > 类名。

在上面我们还定义组件的自定义属性,但Vue并没有提供对自定义属性的声明支持,所以在定义自定义属性时,需要我们在.d.ts文件中扩展ComponentOptions,声明我们自己定义的属性。

declare module 'vue/types/options' {interface ComponentOptions<V extends Vue> {// 自定义的属性pageName?: string;}
}
复制代码

@Prop

在使用Prop装饰器定义属性时,如果我们打开了tsconfig.js 配置文件中的 strictpropertyinitialize 选项,我们就需要通过附加一个!给定义的属性。这就告诉TypeScript:“嘿,放松,其他人会给这个属性赋值”。如果不这样做的话,TypeScript会告诉你: “嘿,注意,这个属性你还没初始化”。需要注意的是: 给属性设置default值,并不是上面的初始化。 ! 它在延迟初始化或重新初始化的场景下很方便使用。

@Component
export default class YourComponent extends Vue {@Prop(Number) propA!: number@Prop({ default: 'default value' }) propB!: string@Prop([String, Boolean]) propC: string | boolean
}
复制代码

上面的问题同样适用于 @Inject、@Model装饰器。

// @Inject
@Component
export class MyComponent extends Vue {@Inject() foo!: string@Inject('bar') bar!: string@Provide() foo = 'foo'@Provide('bar') baz = 'bar'
}// @Model
@Component
export default class YourComponent extends Vue {@Model('change', { type: Boolean }) checked!: boolean
}
复制代码

$refs的使用

我们经常给元素或组件添加ref属性,以便对元素操作和访问组件的属性和方法。但在这里当我们需要使用$refs时,需要提前声明refs内容的类型,以便Typescript能做出正确的类型判断。

<div ref="div"></div><e-component ref="cComponent"></e-componen>
复制代码
import eComponent form 'xxxx'@Component({components: {'e-component': eComponent}
})
export default class YourComponent extends Vue {// 注意这里的感叹号$refs!: {div: HTMLDivElement, // html元素cComponent: eComponent // Typescript可以正确提示出组件中的方法和属性}
}
复制代码

Vuex-class

Vuex-class是把Vuex和vue-class-component绑定到一起的一个包。目前还没有遇到问题,也就不做详解了。具体使用方式请查看文档。

上面就是目前在Vue项目中使用Typescript遇到的问题和注意点,其它问题待后续遇到后加以补充。

转载于:https://juejin.im/post/5b8c9e23f265da433207332d

Typescript在Vue项目中的使用相关推荐

  1. TypeScript深度剖析:Vue项目中应用TypeScript?

    一.前言 与link类似 在VUE项目中应用typescript,我们需要引入一个库vue-property-decorator, 其是基于vue-class-component库而来,这个库vue官 ...

  2. 如何在Vue项目中应用TypeScript?

    一.前言 在VUE项目中应用typescript,我们需要引入一个库vue-property-decorator, # npm 下载 npm i vue-property-decorator -s # ...

  3. 在vue项目中使用prismjs(网页代码高亮插件)

    在vue项目中使用prismjs 什么是prismjs prismjs是一款代码高亮美化插件,在一些技术博客类的网站中需要展示代码时,可以使用它类似与markdown的代码块, 官网链接:https: ...

  4. canvas java 上传截图_在Vue项目中使用html2canvas生成页面截图并上传

    使用方法 项目中引入 npm install html2canvas html代码 //html代码 js代码 // 引入html2canvas import html2canvas from 'ht ...

  5. 如何在Vue项目中使用vw实现移动端适配(转)

    有关于移动端的适配布局一直以来都是众说纷纭,对应的解决方案也是有很多种.在<使用Flexible实现手淘H5页面的终端适配>提出了Flexible的布局方案,随着viewport单位越来越 ...

  6. 实战:vue项目中导入swiper插件

    版本选择 swiper是个常用的插件,现在已经迭代到了第四代:swiper4. 常用的版本是swiper3和swiper4,我选择的是swiper3. 安装 安装swiper3的最新版本3.4.2: ...

  7. vue ajax highcharts,在vue项目中引入highcharts图表的方法(详解)

    npm进行highchars的导入,导入完成后就可以进行highchars的可视化组件开发了 npm install highcharts --save 1.components目录下新建一个char ...

  8. VUE项目中使用this.$forceUpdate();解决页面v-for中修改item属性值后页面v-if不改变的问题

    VUE项目中使用this.$forceUpdate();解决页面v-for中修改item属性值后页面v-if不改变的问题 参考文章: (1)VUE项目中使用this.$forceUpdate();解决 ...

  9. 在vue项目中:统一封装 Axios 接口与异常处理

    在vue项目中:统一封装 Axios 接口与异常处理 参考文章: (1)在vue项目中:统一封装 Axios 接口与异常处理 (2)https://www.cnblogs.com/itgezhu/p/ ...

最新文章

  1. 编写优质代码的 6 大关键方法
  2. 换个角度聊系统稳定性建设(2021版)
  3. RHEL7 单独安装图形 X11
  4. 电脑DIY之内存传输标准
  5. 2017-08-10 前端日报
  6. VTK:图表之NOVCAGraph
  7. 【Boost】boost库asio详解4——deadline_timer使用说明
  8. 数据库:MySQL常见的设计规范误区
  9. 微软也加入FB开放计算项目 发布交换机操作系统
  10. Mysql数据库简单使用(二)
  11. 运行caffe自带的两个简单例子
  12. Invitation Cards(建反图 + 跑两遍SPFA)
  13. uniapp图片自适应_uni-app下input组件基于内容自适应宽度的实现
  14. java futuretask get reject异常_FutureTask的get()方法之异常处理
  15. c语言用graphics画直线 带箭头直线_动漫人体比例怎么画?教你画出萌系少女!...
  16. 医学图像处理眼科检查
  17. 腾讯云即时通信IM实现聊天功能
  18. 大数据解决方案,案例分享
  19. 什么是Web?Web Service、Web API傻傻分不清楚?
  20. [iOS]URL编码和解码

热门文章

  1. 华为2018届校招技术岗笔试题及个人解答
  2. 【重大更新】DevExpress v17.1新版亮点(DevExtreme HTML5/JS篇)
  3. PHP常用正则表达式汇总 [复制链接]
  4. 使用Modernizr 检测HTML5和CSS3浏览器支持功能
  5. Basic Windbg - 1. SOSBasics(再续)
  6. 新建QQ群-欢迎加入
  7. 高考成绩查询2021艺术类6,2021年高考成绩6月26日左右可查!
  8. 基于NMAP日志文件的暴力破解工具BruteSpray
  9. html dom节点类型,浅谈Javascript中的12种DOM节点类型
  10. python游戏服务器引擎_KBEngine游戏服务器引擎环境配置