关于TypeScript的踩坑记录

目录
  • 用字符串做下标报错
  • 函数内使用this报错
  • 找不到模块XXX
  • 引入模块提示找不到声明文件(接上一个问题)
  • JSON直接解析localStorage值报错
  • 初始加载的组件未命名,浏览器打开页面后控制台报错
  • 初始值未定义类型,后面赋值报错
  • 在Vue原型上添加属性使用时报错
  • element-ui使用$message报错
  • vue-cli里使用process对象报错类型找不到
  • vue-cli里tsconfig.json文件报错
  • tsconfig.json配置解释

用字符串做下标报错

代码示例

const person = {
    name: '张三',
    age: 10
};
function getValue(arg: string) {
    return person[arg];
}

错误信息

Element implicitly has an ‘any’ type because expression of type ‘string’ can’t be used to index type ‘{ name: string; age: number; }’.
No index signature with a parameter of type ‘string’ was found on type ‘{ name: string; age: number; }’.ts(7053)

解决方法1

在tsconfig.json中配置suppressImplicitAnyIndexErrors: true

{
    "compilerOptions": {
        "suppressImplicitAnyIndexErrors": true,
        ...
    },
    ...
}

解决方法2

给person定义接口

const person = {
    name: '张三',
    age: 10
};
function getValue(arg: string) {
	interface IPerson {
		[key: string]: any
	}
    return (<IPerson>person)[arg];
}

函数内使用this报错

代码示例

function test() {
    this.title = 'hello';
}

错误信息

‘this’ implicitly has type ‘any’ because it does not have a type annotation.ts(2683)

解决方法

在tsconfig.json中配置noImplicitThis: true

{
    "compilerOptions": {
        "noImplicitThis": true,
        ...
    },
    ...
}

找不到模块XXX

代码示例

import CryptoJS from 'crypto-js';

错误信息

Cannot find module ‘crypto-js’.ts(2307)

解决方法

安装对应的声明文件

cnpm install --save-dev @types/crypto-js

模块声明文件搜索: https://microsoft.github.io/TypeSearch/

如果安装不了或搜不到声明文件,请看下面这种方法

引入模块提示找不到声明文件(接上一个问题)

示例代码

import CryptoJS from 'crypto-js'; 

错误信息

解决方法

在src目录下修改shims-vue.d.ts声明文件,在末尾增加一行 declare module 'xxx模块名';

shims-vue.d.ts文件内容如下:

declare module '*.vue' {
    import Vue from 'vue';
    export default Vue;
}
declare module 'crypto-js';

JSON直接解析localStorage值报错

代码示例

JSON.parse(window.localStorage.getItem('token'));

错误信息

Argument of type ‘string | null’ is not assignable to parameter of type ‘string’.
Type ‘null’ is not assignable to type ‘string’.ts(2345)

解决方法

定义一个指定类型为string的变量接收localStorage值

let token: string | null = window.localStorage.getItem('token');
if (token) {
	JSON.parse(token);
}

初始加载的组件未命名,浏览器打开页面后控制台报错

代码示例

//index.vue
@Component
export default class extends Vue {}
//router.ts
import Index from '@/views/index.vue';
const routes: Array<RouteConfig> = [
    {
        path: '/',
        name: 'index',
        component: Index,
    }
];

错误信息

Invalid component name: “_class2”. Component names should conform to valid custom element name in html5 specification.

解决方法

给初始加载的组件命名

//index.vue
@Component({
	name: 'Index'
})
export default class extends Vue {}

初始值未定义类型,后面赋值报错

代码示例

export default class extends Vue {
    private search = {
        name: '',
        types: [];
    };

    private typesChange(value: string[]) {
        this.search.types = value; //这里报错
    }
}

错误信息

Type ‘string[]’ is not assignable to type ‘never[]’.
Type ‘string’ is not assignable to type ‘never’.

解决方法

给初始赋值类型断言

export default class extends Vue {
    private search = {
        name: '',
        types: [] as string[]; //这里加断言
    };

    private typesChange(value: string[]) {
        this.search.types = value;
    }
}

在Vue原型上添加属性使用时报错

示例代码

import Vue from 'vue';
import http from './http';
Vue.prototype.$http = http;
this.$http.post('/test', {}).then(
   (resolve: any) => {
       console.log(resolve);
   },
   (reject: any) => {
       console.log(reject);
   }
);

错误信息

解决方法

在src目录下新建vue.d.ts声明文件

vue.d.ts文件内容如下:

import Vue from 'vue';
declare module 'vue/types/vue' {
    interface Vue {
        $http: any;
    }
}

element-ui使用$message报错

解决方法

在src目录下新建vue.d.ts声明文件

vue.d.ts文件内容如下:

import Vue from 'vue';
import { ElMessage } from 'element-ui/types/message';
declare module 'vue/types/vue' {
    interface Vue {
        $message: ElMessage;
    }
}

vue-cli里使用process对象报错类型找不到

解决方法

修改项目根目录下的tsconfig.json文件中的compilerOptions.types值,新增node

compilerOptions.types配置内容如下:

"compilerOptions": {
    "types": ["webpack-env", "node"],
}

vue-cli里tsconfig.json文件报错

错误信息

JSON schema for the typescript compiler's configuration file.
cannot find type definition file for 'webpack-env'.

解决方法

没找到好的解决方法,偶然间尝试了下面的方法居然就不报错了,这种方法不一定适用所有人的项目

修改项目根目录下的tsconfig.json文件中的compilerOptions.types值,先新增"nodejs",再删除"nodejs"

先新增:

"compilerOptions": {
    "types": ["webpack-env", "nodejs"],
}

再删除:

"compilerOptions": {
    "types": ["webpack-env"],
}

边踩坑,边更新。。。

————————————分割线————————————

tsconfig.json配置解释

{
    "compilerOptions": {
        "noEmitOnError": true // 编译的源文件中存在错误的时候不再输出编译结果文件
    }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 详解vue-class迁移vite的一次踩坑记录

    目录 what happen 探究 解决 总结 what happen 最进项目从 vue-cli 迁移到了 vite,因为是 vue2 的项目,使用了 vue-class-component类组件做 ts 支持.当然迁移过程并没有那么一帆风顺,浏览器控制台报了一堆错,大致意思是某某方法为 undefined,无法调用.打印了下当前 this,为 undefined 的方法都来自于 vuex-class 装饰器下的方法.这就是一件很神奇的事,为什么只有 vuex-class 装饰器下的方法才会为

  • vite2.0 踩坑实录

    目录 vite项目构建优化 其它 最后 算是对上一篇的补充,记录了一些在配置项目中遇到的问题,希望对大家能有所帮助- vite项目构建优化 路由动态导入 经过rollup的构建,动态导入的文件将会生成异步的chunk文件,在我们访问项目的时候按需加载,极大的提升应用的加载速度 import Home from '@/views/home/index.vue' import Layout from '@/components/Layout.vue' const routes: Array<Rout

  • 使用VueCli3+TypeScript+Vuex一步步构建todoList的方法

    前言 Vue3.x 即将来袭,使用 TypeScirpt 重构,TypeScript 将成为 vue 社区的标配,出于一名程序员的焦虑,决定现在 Vue2.6.x 踩一波坑. vue 官方文档已经简略地对 typescript 的支持进行了介绍,我们使用 Vue Cli3 直接生成项目 创建项目 ❓为什么使用 Vue Cli3 构建项目 官方维护,后续升级减少兼容性问题 使用以下配置进行项目的生成: Babel 对 Ts 进行转译 TSLint 对 TS 代码进行规范,后续会使用 prettie

  • 关于Vue3&TypeScript的踩坑汇总

    目录 安装环境 创建项目 1.配置路由 2.安装VueX 3.安装国际化 4.vite.config.ts常用配置 5.找不到模块声明declare 6.path模块找不到 打包问题 Vite打包后显示跨域 Vue3.0的新语法糖-script setup Css中使用JS代码 Ref.toRef.toRefs.Reactive总结 v-model PropType toRefs解构.Reactive Ref.toRef.toRefs.Reactive readonly isProxy toRa

  • 关于TypeScript的踩坑记录

    目录 用字符串做下标报错 函数内使用this报错 找不到模块XXX 引入模块提示找不到声明文件(接上一个问题) JSON直接解析localStorage值报错 初始加载的组件未命名,浏览器打开页面后控制台报错 初始值未定义类型,后面赋值报错 在Vue原型上添加属性使用时报错 element-ui使用$message报错 vue-cli里使用process对象报错类型找不到 vue-cli里tsconfig.json文件报错 tsconfig.json配置解释 用字符串做下标报错 代码示例: co

  • .net core 3.1在iis上发布的踩坑记录

    前言 写这篇文章的目的是希望像我一样喜欢.net 的人在发布 core到 iis上时少走点弯路 网上找了些资料,其实实际操作比较简单,就是有几个坑很恶心 踩坑记录 首先是你的服务器需要有core 的运行环境,安装前先关闭iis dotnet-hosting-3.1.4-win.exe 可以去微软的官网找最新的版本(去微软的官网找你要的版本就好了) 安装成功后,第一个坑出现了,启动iis,发现原来在iis上的网站都报503错误了. 直接玩大了,最后发现就是这个东西搞的鬼,你卸载它iis之前的网站就

  • Linux/Docker 中使用 System.Drawing.Common 踩坑记录分享

    前言 在项目迁移到 .net core 上面后,我们可以使用 System.Drawing.Common 组件来操作 Image,Bitmap 类型,实现生成验证码.二维码,图片操作等功能.System.Drawing.Common 组件它是依赖于 GDI+ 的,然后在 Linux 上并没有 GDI+,面向谷歌编程之后发现,Mono 团队使用 C语言 实现了GDI+ 接口,提供对非Windows系统的 GDI+ 接口访问能力,这个应该就是libgdiplus.所以想让代码在 linux 上稳定运

  • Java踩坑记录之Arrays.AsList

    前言 java.util.Arrays的asList方法可以方便的将数组转化为集合,我们平时开发在初始化ArrayList时使用的比较多,可以简化代码,但这个静态方法asList()有几个坑需要注意: 一. 如果对集合使用增加或删除元素的操作将会报错 如下代码: List list = Arrays.asList("a","b","c"); list.add("d"); 输出结果: Exception in thread &q

  • Java踩坑记录之BigDecimal类

    前言 在java.math包中提供了对大数字的操作类,用于进行高精确计算,如BigInteger,BigDecimal类.而平常我们开发中使用最多的float和double只能适用于一般的科学和工程计算,如果要在比较精确的计算方面如货币,那么使用float和double会相应的丢失精度,因此用于精密计算大数字的类BigDecimal就必不可少了.所以BigDecimal适合商业计算场景,用来对超过16位有效位的数进行精确的运算.但是BigDecimal的使用并不像float和double那样,使

  • 关于python scrapy中添加cookie踩坑记录

    问题发现: 前段时间项目中,为了防止被封号(提供的可用账号太少),对于能不登录就可以抓取的内容采用不带cookie的策略,只有必要的内容才带上cookie去访问. 本来想着很简单:在每个抛出来的Request的meta中带上一个标志位,通过在CookieMiddleware中查看这个标志位,决定是否是给这个Request是否装上Cookie. 实现的代码大致如下: class CookieMiddleware(object): """ 每次请求都随机从账号池中选择一个账号去访

  • python中remove函数的踩坑记录

    摘要: 在python的使用过程中,难免会遇到要移除列表中对象的要求.这时可以使用remove函数. 对于python中的remove()函数,官方文档的解释是:Remove first occurrence of value.大意也就是移除列表中等于指定值的第一个匹配的元素. 语法 list.remove() 参数 obj 参数:从列表中删除的对象的索引 返回值 删除后不会返回值 常见用法: a = [1,2,3,4],a.remove(1),然后a就是[2,3,4]:对于a = [1,1,1

  • Echarts在Taro微信小程序开发中的踩坑记录

    背景 近期笔者在使用Taro进行微信小程序开发,当引入Echarts图表库时,微信检测单包超限2M的一系列优化措施的踩坑记录,期望能指导读者少走一些弯路. 为什么选择Echarts? 微信小程序目录市面上使用最多的两款图表库,如下: echarts-for-weixin--echarts微信小程序版本 wx-charts--基于微信小程序的图表库 对比两款图表库优缺点刚好相反. echarts-for-weixin:功能强大,但体积非常大 wx-charts:功能相对简单,但体积小 由于笔者对e

  • 微信小程序开发篇之踩坑记录

    最近参与开发了公司的第一款小程序,开发体验基本类似于基于webview的混合式开发,可以调用官方强大的api,但也有一些坑或者说不习惯的地方.这篇文章从实用性出发,记录了开发过程中的一些问题: 1. 样式优先级混乱 在使用button组件时,发现在class中设置width不生效,下面贴上代码: .my-button{ width: 140rpx; height: 60rpx; line-height: 60rpx; padding: 0; } 经过微信调试工具排查后,发现user agent的

随机推荐