关于typescript改造旧项目的一些坑


‘@/‘ 引入组件报红问题

  • 使用 ‘@/xxx/xxx’ 引入组件,vetur报红 找不到module,但是可以正常运行问题
  • 解决办法:1.把项目目录放工作区根目录;2.项目一定排列在第一位

引入第三方包报红

  • 引入第三方库 报红找不到module,无法正常使用包,如qs、jQuery
  • 解决办法1:使用@types进行包管理,然后正常引入
npm i @types/qs
import qs from 'qs'
  • 解决办法2:有些包不能用@types管理,自己写声明 XX.d.ts 不推荐

router配置里引入component组件的时候必须添加.vue后缀

Element表单验证报红问题

// 报错信息如下
// Property 'validate' does not exist on type 'Vue | Element | Vue[] | Element[]'.
// Property 'validate' does not exist on type 'Vue'.

// 解决办法
import { Form } from "element-ui";
( this.$refs.loginForm as Form ).validate((valid: boolean ) => {
  ...
 });

// 如果不引入Form,把Form换成any也可以,但是typescript会报警告⚠
  • 使用axios封装的请求,然后解构请求结果报错
// 报错信息
// Property 'XXX' does not exist on type 'AxiosResponse<any>'

// 解决办法
// 新建axios.d.ts文案,添加如下内容,重启项目
import * as axios from 'axios'

declare module 'axios' {
  interface AxiosInstance {
    (config: AxiosRequestConfig): Promise<any>
  }
}
@typescript/esline 报错 xxx_x is not in camel case

关闭esline驼峰校验

// 在.eslinetrc.js中配置如下:
rules: {
  ...
  '@typescript-eslint/camelcase': 'off',
}

TS使用”require”报错

  • 提示报错信息:Cannot find name ‘require’. Do you need to install type definitions for node? Try ‘npm i –save-dev @types/node’
  • 解决方案:
    • 1.安装@types/node,npm i –save-dev @types/node;
    • 2.在tsconfig.json中的compilerOptions中的types添加”node”;
    • 3.在使用require前面添加declare var require:any

TS使用”this.xxx”报错

// 使用"this.$router.push("/xxx")" => Property '$router' does not exist on type 'Experiment'.
// 解决:
(this as any).$router.push("/xxx")
this.$refs.mainVideo => Property 'clientWidth' does not exist on type 'Vue | Element | Vue[] | Element[]'.
// Property 'clientWidth' does not exist on type 'Vue'
// 解决:
(this.$refs.mainVideo as any).clientWidth

  目录