Vue3之Typescript错误

标签: 无 分类: 未分类 创建时间:2022-10-18 05:31:41 更新时间:2023-10-20 11:23:26

前言

这里的错误,基本上都是在使用vue3.0+typescript开发或者编译的时候报的错误。

1.The ‘+’ operator cannot be applied to type ‘symbol’

在模板中使用动态class时,执行build时出现这个错误,这个的意思其实就是说如果menuClass类型是symbol,那么就不能使用+操作符号。

1
2
3
4
5
6
7
8
9
10
<template>
<div :class="['menu-wrap','menu-'+menuClass]">
</div>
</template>

<script lang="ts">
const route=useRoute();
let routeName:RouteRecordName| null | undefined=route.name?.toString();
const menuClass:Ref<RouteRecordName | undefined>=ref(routeName||"home");
</script>

【解决方法】
将类型 RouteRecordName 转为 string 类型。

1
2
3
const route=useRoute();
let routeName:string| null | undefined=route.name?.toString();
const menuClass:Ref<string | undefined>=ref(routeName||"home");

【解决】
这个问题可以通过定义变量的类型进行解决

1
const menuClass:Ref<string>=ref(routeName||"home");

2.初始值设定项类型 RouteRecordName | null | undefined 不可分配给变量类型 <>() => any

这个主要是在使用ref进行定义变量的时候报的错

1
2
3
4
const route=useRoute();
let routeName=route.name;
const menuClass=ref(routeName||"home");

【解决方法】
增加类型声明,这个 RouteRecordName 是在 vue-router 中定义的,还有 RouteLocationMatched 等。

1
2
3
const route=useRoute();
let routeName:RouteRecordName | null | undefined=route.name;
const menuClass:Ref<RouteRecordName | undefined>=ref(routeName||"home");
参考文章:
1.为 ref() 标注类型

3.Type ‘($event: any) => void’ is not assignable to type ‘MouseEvent’

这个主要是在定义函数的时候出现的问题,menuClick(‘home’) 我的本意就是直接在调用的时候传递一个参数,结果就是死活编译不通过。

1
2
3
4
5
6
<div class="menu-item menu-item-home" @click="menuClick('home')">首页</div>

// 函数
const menuClick=(name)=>{
router.push({name:name});
}

【解决方法】
我将@type/node 版本从 18.11.7 降为了18.8.0,解决了这个问题

1
2
3
4
5
## 删除
pnpm remove @types/node -D

## 安装
pnpm add @types/node@18.8.0 -D
参考文章:
1.Type ‘void’ is not assignable to type ‘((event: MouseEvent) => void) | undefined’
2.TypeScript error for @click - Type ‘() => void’ is not assignable to type ‘undefined’ #464 这里说可以降级types:Downgrade to types/18.8.0 fixed the issue,使用:npm i @types/node@18.8.0
3.Type ‘void’ is not assignable to type ‘(event: MouseEvent<HTMLDivElement, MouseEvent>) => void’ Change onClick={handleClose(languages[0])} into arrow function like this
3.不能将类型“($event: any) => void”分配给类型“MouseEvent” 这个是将 types/node 的18.8.4 降级为了 18.7.18
4.vue3的自定义事件传参
5.vue ts click中的事件类型怎么写? evt.target as HTMLInputElement
6.Vue3.x:给组件默认函数添加参数如change、onchange等 @change=”isMainTable($event, index)” $event 是我们的默认参数,index是我们的自带参数

4.Object literal may only specify known properties, and ‘hidden’ does not exist in type ‘RouteRecordRaw’.

这个问题,主要是因为我在router.ts中,写了这么一个东西,增加了一个不存在的属性hidden,所以导致报错了。

1
2
3
4
5
6
7
8
9
export const constantRoutes:Array<RouteRecordRaw>= [
{
path: '/401',
name:"401",
component: () => import('@/views/error/401.vue'),
// 这里有问题
hidden: true
},
]

【解决方法】
删除上面的hidden属性就可以了。

5.Parameter ‘row’ implicitly has an ‘any’ type

这个主要就是参数传递的类型不同导致的

1
2
3
4
5
6
7
<el-button size="small" :text="true" type="primary" @click="handleEdit(scope.row)">添加线索</el-button>

<script lang="ts" setup>
const handleEdit=(row)=>{
console.log(row);
}
</script>

【解决方法】
本来是应该定义一个接口类型的,我这里暂时定义一个any类型

1
2
3
const handleEdit=(row:any)=>{
console.log(row);
}

6.Type ‘null’ is not assignable to type ‘NodeListOf

这个主要就是在清空一个dom变量的时候报错了,我直接将获取到的document制空,本意是想着删除一个dom元素,结果报错了。

1
2
3
4
5
let $els=document.querySelectorAll(".menu-wrap .menu-item");
if($els){
// ....
$els=null;
}

【解决方法】
可以定义一个 NodeListOf | null 类型,这样就可以清空了。

1
2
3
4
5
let $els:NodeListOf<HTMLElement> | null=document.querySelectorAll(".menu-wrap .menu-item");
if($els){
// ....
$els=null;
}

7.Cannot find module ‘./components/HeaderTop’ or its corresponding type declarations.

这个问题主要就是我引入了一个自定义的模块,但是同样一个目录下的另外一个模块,就没有报这个错误。

1
2
3
// 错误
import HeaderTop from "./components/HeaderTop"
import TopMenu from "./components/TopMenu.vue"

【解决方法】
查看两个不同的组件的声明TopMenu比HeaderTop多了一个.vue,虽然开发的时候不报错,但是在编译的时候,还是会出现错误的,那么响应的解决方法就是添加.vue后缀

1
2
3
// 正确
import HeaderTop from "./components/HeaderTop.vue"
import TopMenu from "./components/TopMenu.vue"

8.Object is possibly ‘undefined’

调用一个可能不存在的方法的时候,出现了这个问题,也就是说 parents.name 可能是未定义

1
2
3
4
5
6
let parents:RouteLocationMatched=routes[1];
let tmenuClass:string="home";
if(parents){
// 这里有问题
tmenuClass=parents.name.toString();
}

【解决方法】
在转换字符串的时候,使用?.符号进行操作。

1
2
3
4
5
6
const routes = route.matched;
let parents:RouteLocationMatched=routes[1];
let tmenuClass:string|undefined="home";
if(parents){
tmenuClass=parents.name?.toString();
}

9.分配的表达式类型 string | symbol | undefined 不可分配给类型 string

这个也是类型推断的问题,主要就是 tmenuClass=parents.name 这句话。

1
2
3
4
5
let parents:RouteLocationMatched=routes[1];
let tmenuClass:string="home";
if(parents){
tmenuClass=parents.name;
}

【解决方法】
解决方法就是将 parents.name 转换为字符串,使用toString() 方法。

1
2
3
4
5
6
const routes = route.matched;
let parents:RouteLocationMatched=routes[1];
let tmenuClass:string|undefined="home";
if(parents){
tmenuClass=parents.name?.toString();
}

10.’/App.vue.jsx’ is a JavaScript file. Did you mean to enable the ‘allowJs’ option

这个在编译的时候出现了问题。

【解决方法】
在tsconfig.json中的 compilerOptions 节点,添加 “allowJs”: true。

1
2
3
4
5
6
7
8
{
"compilerOptions": {
...
"allowJs": true,
},
"include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"],
"references": [{ "path": "./tsconfig.node.json" }]
}

11.eslintrc.js is treated as an ES module file as it is a .js file whose nearest parent package.json contains “type”: “module” which declares all .js files in that package scope as ES modules

【解决方案】
将 .eslintrc.js 重命名为 .eslintrc,写成 json 文件格式。

小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。