error TS2339: Property ‘$route‘ does not exist on type报错问题处理

1、问题描述

今天收到一个需求,要参考某个项目的功能逻辑并增加自己的页面,由于工期限制,直接拷贝原项目代码增加页面,在打包部署时突然出现该报错。

error TS2339: Property '$route' does not exist on type

2、解决办法

思考了一下,因为刚复制完增加页面后的启动和打包都是正常的。问题应该出现在我精简依赖后删除lock文件重新拉包的问题上。恢复原来的lock文件发现问题未出现。

通过git对比lock文件发现vue-router的版本存在差异,不报错的版本为4.3.0,报错的版本为4.5.1,调整后发现问题解决。

3、猜想

按照报错提示,我猜拉取types/vue-router包应该也能解决此处报错。(可能理解不到位,请各位指点。)

ERROR in src/modules/data-map/data-table/assets-table-detail/blood/views/g6-blood-table.vue:37:14 TS2339: Property '$axios' does not exist on type 'CombinedVueInstance<Vue, object, object, object, Record<never, any>>'. 35 | if (isInit) { 36 | request = () => > 37 | vm.$axios | ^^^^^^ 38 | .$get(tableLineageBlood(tableId), { 39 | params: { 40 | upstreamLevel: 1, ERROR in src/modules/data-map/data-table/assets-table-detail/blood/views/g6-blood-table.vue:44:19 TS7006: Parameter 'res' implicitly has an 'any' type. 42 | }, 43 | }) > 44 | .then(res => res.payload) | ^^^ 45 | } else { 46 | request = () => 47 | vm.$axios ERROR in src/modules/data-map/data-table/assets-table-detail/blood/views/g6-blood-table.vue:47:14 TS2339: Property '$axios' does not exist on type 'CombinedVueInstance<Vue, object, object, object, Record<never, any>>'. 45 | } else { 46 | request = () => > 47 | vm.$axios | ^^^^^^ 48 | .$get(lineageBlood, { 49 | params: { 50 | nodeId: data.nodeId, ERROR in src/modules/data-map/data-table/assets-table-detail/blood/views/g6-blood-table.vue:55:19 TS7006: Parameter 'res' implicitly has an 'any' type. 53 | }, 54 | }) > 55 | .then(res => res.payload) | ^^^ 56 | } 57 | return request().then((payload: any) => { 58 | return { ERROR in src/modules/data-map/data-table/assets-table-detail/blood/views/g6-blood-table.vue:112:22 TS2339: Property '$router' does not exist on type 'CombinedVueInstance<Vue, object, object, object, Record<never, any>>'. 110 | value: data.dataCollectSuccess 111 | ? `<a class="tooltip-value primary" href="${ > 112 | vm.$router.resolve(`/data-map/data-table/${data.tableId}`).href | ^^^^^^^ 113 | }"> ${data.tableName} </a>` 114 | : data.tableName, 115 | }, FATAL Nuxt build error 09:02:49 at WebpackBundler.webpackCompile (node_modules/@nuxt/webpack/dist/webpack.js:1888:21) at async WebpackBundler.build (node_modules/@nuxt/webpack/dist/webpack.js:1853:5) at async Builder.build (node_modules/@nuxt/builder/dist/builder.js:249:5) at async ensureBuild (node_modules/@nuxt/cli/dist/cli-generate.js:117:3) at async Object.run (node_modules/@nuxt/cli/dist/cli-generate.js:234:7) at async NuxtCommand.run (node_modules/@nuxt/cli/dist/cli-index.js:356:7) ╭─────────────────────────────╮ │ │ │ ✖ Nuxt Fatal Error │ │ │ │ Error: Nuxt build error │ │ │ ╰─────────────────────────────╯
最新发布
08-15
<think>嗯,用户问的是TypeScript错误TS2339,具体是“Property 'value' does not exist on type 'never’”。我需要先理解这个错误的含义。TypeScript中的类型检查很严格,当访问一个对象的属性而TypeScript认为该对象的类型不包含该属性时,就会抛出这个错误。 首先,用户可能是在尝试访问一个被推断为“never”类型的变量的属性。为什么会是“never”类型呢?通常是因为变量在某个作用域内无法被正确推断出类型,或者条件判断导致TypeScript认为该变量不可能有值。 接下来,我应该考虑常见的场景。比如,使用数组的find方法后,如果没有正确的类型断言或类型保护,TypeScript可能会推断结果为“never”,导致访问属性时报错。或者在使用联合类型时,没有进行类型收窄,导致访问不存在的属性。 然后,我需要思考如何解决这个问题。可能的解决方法包括添加类型断言、使用类型保护(如类型谓词或类型判断)、检查变量是否确实有值,或者在声明变量时明确指定类型,避免被推断为“never”。 还要考虑用户可能的代码示例,比如: const arr = []; const item = arr.find(i => i.id === 1); console.log(item.value); // 这里arr是never[],item是never类型 这时候,用户会得到TS2339错误,因为arr被推断为never[],所以item是never。解决方法包括初始化数组时指定类型,或者在find后使用类型断言。 另外,如果用户使用了联合类型,但未正确收窄类型,也可能导致此错误。例如: let foo: string | number; if (typeof foo === 'string') { console.log(foo.length); } else { console.log(foo.toFixed(2)); // 这里没问题,因为else块中foo是number } 但如果条件判断有误,可能导致TypeScript无法正确推断类型,从而出现错误。 还需要提醒用户检查变量是否可能为undefined或null,使用可选链操作符(?.)或非空断言(!)来避免错误,但要注意潜在的风险。 最后,总结解决步骤:确定变量类型推断的原因,添加类型注解或初始化值,使用类型保护或断言,检查条件逻辑是否正确,以及合理使用TypeScript的工具来处理可能为空的变量。</think>当你在 TypeScript 中遇到 **error TS2339: Property 'value' does not exist on type 'never'** 时,这表示你正在尝试访问一个被 TypeScript 推断为 `never` 类型的对象的属性,但该类型上确实不存在该属性。以下是逐步解释和解决方法: --- ### **错误原因** 1. **`never` 类型的来源** TypeScript 的 `never` 类型表示永远不可能存在的值,常见场景: - 空数组未被正确类型标注时会被推断为 `never[]` - 类型收窄(Type Narrowing)后的不可能分支 - 未初始化的变量或错误的类型推断 2. **典型场景** 例如,你尝试从空数组中查找元素: ```typescript const arr = []; // 类型被推断为 never[] const item = arr.find(i => i.id === 1); // item 的类型是 never console.log(item.value); // 错误:Property 'value' does not exist on type 'never' ``` --- ### **解决方法** #### 1. **为变量/数组明确指定类型** ```typescript // 明确数组元素的类型 const arr: { id: number; value: string }[] = []; const item = arr.find(i => i.id === 1); if (item) { console.log(item.value); // 正确:item 的类型被推断为 { id: number; value: string } } ``` #### 2. **使用类型断言(Type Assertion)** ```typescript const arr = [] as { value: string }[]; // 断言数组类型 const item = arr.find(i => true); console.log((item as { value: string }).value); // 手动断言类型 ``` #### 3. **类型保护(Type Guard)** ```typescript const arr: Array<{ value?: string }> = []; const item = arr.find(i => true); if (item?.value) { // 使用可选链操作符(?.) console.log(item.value); // 安全访问 } ``` #### 4. **初始化变量时提供默认值** ```typescript let obj: { value: string } | null = null; // 明确联合类型 obj = { value: "hello" }; // 后续赋值 console.log(obj.value); // 安全访问(需先检查非空) ``` #### 5. **避免隐式的 `never` 类型** ```typescript // 错误示例:函数返回 never function fail(): never { throw new Error("Error"); } const result = fail(); // result 的类型是 never console.log(result.value); // 报错 ``` --- ### **常见案例** #### 案例 1:未类型化的空数组 ```typescript // 错误 const list = []; list.push(1); // 报错:类型“number”的参数不能赋给类型“never”的参数 // 修复 const list: number[] = []; list.push(1); // 正确 ``` #### 案例 2:条件分支中的类型收窄 ```typescript function test(val: string | number) { if (typeof val === "string") { console.log(val.length); } else { // 此处 val 是 number,但若错误访问属性会报错 console.log(val.toFixed(2)); } } ``` --- ### **总结** - **核心问题**:TypeScript 无法推断变量类型,导致它被标记为 `never`。 - **关键步骤**:明确变量类型、使用类型保护、避免隐式 `never`。 - **工具**:利用 TypeScript 的可选链(`?.`)、非空断言(`!`)和类型断言(`as`)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值