赞
踩
摘要: 原有的项目是通过vue-cli3创建的vue项目,引入ts进行开发,不影响之前的页面。
npm install typescript ts-loader --D
npm install vue-property-decorator // 用于在.vue文件中使用ts语法,第一次用-D的方式安装发现不支持
# vue.config.js # 使用ts-loader来转换ts文件 module.exports = { configureWebpack: { resolve: { extensions: [".ts", ".tsx", ".js", ".json"] }, module: { rules: [ { test: /\.tsx?$/, loader: 'ts-loader', exclude: /node_modules/, options: { appendTsSuffixTo: [/\.vue$/], } } ] } } }
# 在根目录下新增tsconfig.json (用来编译这个项目的根文件和编译选项) { "compilerOptions": { "baseUrl": "." // 基础目录,如果有配置了paths必须加这一项 "target": "es5", // 编译目标平台 "module": "commonjs", // 指定模块生成方式,["commonjs", "amd", "umd", "system", "es6", "es2015", "esnext", "none"] "strict": true, // 同时开启 alwaysStrict, noImplicitAny, noImplicitThis 和 strictNullChecks "esModuleInterop": true, //允许export = 导出,由import from导入 "experimentalDecorators": true ,//启用装饰器 "allowJS": true, // 允许编译javascript文件,不加这一条,在ts中引用js文件就需要定义声明文件 "paths": { "@/*": ["src/*"] // 设置路径别名 "src/api/index.js" => "@/api/index.js" } } } # 路径别名设置无效;experimentalDecorators: true 无效 #如果配置项无效是因为在vscode中只会识别工作区第一个项目的tsconfig.js ,解决办法是将项目作为工作区的第一个项目,或者在该工作区的第一个项目中新建tsconfig.json加上这些配置
# 需要在ts环境下识别vue文件,在src目录下添加 vue-shim.d.ts 全局声明文件
declare module "*.vue" {
import Vue from "vue";
export default Vue;
}
# 基本组件用法,和之前的vue组件用法类似,有生命周期函数、data、props、watch、computed、methods <script lang="ts"> import { Component, Vue } from 'vue-property-decorator' export default Vue.extend({ props: { propA: { type: Number }, propB: { default: 'default value' }, propC: { type: [String, Boolean] } } data() { return {} }, watch: { child(newVal) {}, // 这种写法默认 `immediate`和`deep`为`false` person: { handler: () => {}, immediate: true, deep: true } } created(){}, methods:{ getData():void{...} } }) </script>
# 基于类的vue组件 <script lang="ts"> import { Component, Vue, Prop, Watch } from 'vue-property-decorator' @Component // 注明了此类为一个Vue组件,不管有没有引用外部组件,这个都要加,否则正常路由跳转会正常显示页面,但是手动刷新页面就会报错不显示页面 // 引入外部组件 // @Component({ // components: { // test // } //}) // 组件过滤器(filters) // @Component({ // filters: { // filterValue(val) {return value + 1} // } //}) export default class Index extends Vue { // @Prop 替换Vue中的props属性 @Prop(Number) readonly propA!: number; @Prop({default: 'default value'}) readonly propB!: string; @propC([String, Boolean]) readonly propC: string | boolean; // readonly可以不加,这里 !和可选参数?是相反的, !告诉TypeScript我这里一定有值,如果没有,那么你应该使用| undefined // 计算属性呢要用到getter get ValA(){ return 1; } // @Watch装饰器来替换Vue中的watch属性 @Watch('child') onChangeValue(newVal: string, oldVal: string){ // todo... } @Watch('person', {immediate: true, deep: true}) onChangeValue(newVal: Person, oldVal: Person){ // todo... } // data里的初始数据可以直接声明为实例的属性 msg: string = 'hello world' // 组件methods里面的方法也可以直接声明为实例的方法 onClick (): void { window.alert(this.message) } // 生命周期函数直接作为实例方法 created(): void {} mounted(): void {} } </script>
总结:
1. 原来的vue文件不受影响,在新的vue文件中使用ts只需要在script标签中加上lang="ts"即可
2.js文件要使用ts直接将文件后缀改成.ts,
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。