已有vue项目引入ts

项目配置

安装依赖

  • npm i vue-class-component vue-property-decorator —S

  • npm i ts-loader typescript tslint tslint-loader tslint-config-standard -D

      vue-class-component:扩展vue支持typescript,将原有的vue语法通过声明的方式来支持ts
    
      vue-property-decorator:基于vue-class-component扩展更多装饰器
    
      ts-loader:让webpack能够识别ts文件
    
      tslint-loader:tslint用来约束文件编码
    
      tslint-config-standard:tslint 配置 standard风格的约束
    

初始化tsconfig

	tsc --init
{
  "compilerOptions": {
     // 编译输出目标 ES 版本
    "target": "es5",
    // 采用的模块系统
    "module": "ESNext",
    // 以严格模式解析
    "strict": true,
    "strictNullChecks": true,
    "esModuleInterop": true,
    // 启用装饰器
    "experimentalDecorators": true, // 
    // 如何处理模块
    "moduleResolution":"node"  ,
    // 给错误和消息设置样式,使用颜色和上下文。
    "pretty": true,
    "sourceMap":true
  },
  "include": [
    "src/**/*.ts",
    "src/**/*.tsx",
    "src/**/*.vue",
    "tests/**/*.ts",
    "tests/**/*.tsx"
  ],
  // ts 排除的文件
  "exclude": ["node_modules"]
}

vue.config.js

webpack 配置

configureWebpack: {
    resolve: { extensions: [".ts", ".tsx", ".js", ".json"] },
    module: {
        rules: [
            {
                test: /\.ts$/,
                exclude: /node_modules/,
                enforce: 'pre',
                loader: 'tslint-loader'
            },
            {
                test: /\.tsx?$/,
                loader: 'ts-loader',
                exclude: /node_modules/,
                options: {
                    appendTsSuffixTo: [/\.vue$/],
                }
            }
        ]
    }
},

新建ts解析.vue

  • shims-tsx.d.ts

     // shims-tsx.d.ts  src目录下
     import Vue, { VNode } from 'vue';
     declare global {
       namespace JSX {
         // tslint:disable no-empty-interface
         interface Element extends VNode {}
         // tslint:disable no-empty-interface
         interface ElementClass extends Vue {}
         interface IntrinsicElements {
           [elem: string]: any;
         }
       }
     }
    
  • shims-vue.d.ts

    	// shims-vue.d.ts   src目录下
    	declare module '*.vue' {
    	  import Vue from 'vue';
    	  export default Vue;
    	}
    	
    	//为了typescript做的适配定义文件,因为.vue文件不是一个常规的文件类型,
    	//TypeScript是不能理解vue文件是干嘛的,加这一段是是告诉 TypeScript,vue文件是这种类型的。
    	//没有这个文件,会发现 import 导入的所有.vue类型的文件都会报错。
    

    添加tslint.json

     {
    		    "extends": "tslint-config-standard",
    		    "globals": {
    		      "require": true
    		    }
     }
    

踩坑点

  • 由于webpack和ts-loader版本不兼容,需要降低webapck或者ts-loader版本webpack 4.0
    使用ts-loader 8.2.0版本

  • 已有项目引入ts,需要把main.js修改为main.ts(热更新的时候 ts页面找不到引入的文件)

  • 类型上不存在属性

  • form表单验证

    // Property 'validate' does not exist on type 'Vue | Element | Vue[] | Element[]'  
    // 上面的链接解决不了可以使用下面的方法
    
    const formValidate:any = this.$refs
    formValidate[name].validate(async (valid:boolean) => {
      if (valid) {}
    })
    
  • 报错Could not find a declaration file for module xxx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值