TS2749:“XXX”指的是一个值,但在这里被用作一个类型。您的意思是“typeof XXX”吗?

Posted

技术标签:

【中文标题】TS2749:“XXX”指的是一个值,但在这里被用作一个类型。您的意思是“typeof XXX”吗?【英文标题】:TS2749: 'XXX' refers to a value, but is being used as a type here. Did you mean 'typeof XXX'? 【发布时间】:2021-07-07 08:15:49 【问题描述】:

我在运行使用Nuxt.js 开发的npm run dev 时遇到了一个非常奇怪的错误,该Vue.js 组件具有Vue.js。也就是说,在运行应用程序时,我看到了与TypeScript 相关的错误,例如TS2749: 'About' refers to a value, but is being used as a type here. Did you mean 'typeof About'?,即使npm run test 没有显示任何内容。

我的 spec.ts 文件带有抱怨行

import  shallowMount, Wrapper  from "@vue/test-utils";    
import About from "@/pages/about.vue";

describe("About", () => 
  const wrapper: Wrapper<About> = shallowMount(About); // <-- Complaining line
  ...

在设置输入之前突出显示类型应该没问题,它显示了下面的类型。

const wrapper: Wrapper&lt;typeof About&gt; = shallowMount(About); 的建议解决方案会生成另一个 TypeScript 错误,导致测试无法编译。即TS2344: Type 'ExtendedVue&lt;Vue, unknown, unknown, setLocation: any; , unknown&gt;' does not satisfy the constraint 'Vue'. Type 'VueConstructor&lt; setLocation: any; &amp; Vue&gt;' is missing the following properties from type 'Vue': $el, $options, $parent, $root, and 32 more.

我不确定为什么 test 保持沉默,而 TypeScript 在本地运行应用程序时开始抱怨测试本身。他们都通过了顺便说一句,应用程序编译。它只是与TypeScript@vue/test-utils 中的某种类型有关。

【问题讨论】:

当 TS 似乎完全能够推断出类型时,你为什么还要输入wrapper 用于显式输入 输入是明确的 - 它来自@vue/test-utils。重复输入自己的代码感觉不对... 好吧,我已经删除了它以获得一个清晰的控制台。但是,如果可读性和文档的类型相同,我更喜欢使用显式类型,并且它不应该在控制台中引起任何问题。特别是,如果测试没有显示任何内容,而 npm run dev 显示。 运行良好的测试真的很奇怪,因为Wrapper&lt;About&gt; 确实不是有效的 TS 类型定义。 &lt;&gt; 内的任何东西都必须是 TS 类型 - About 不是 TS 类型,它实际上是一个值(Vue 组件定义对象) 【参考方案1】:

Wrapper&lt;About&gt; 确实是个问题——这是 TS 类型定义,About 不是 TS 类型……它确实是一个值(Vue 组件定义对象)。

试试Wrapper&lt;InstanceType&lt;typeof About&gt;&gt;

显式声明来自外部库的类型(带有类型),实际上忽略 TS 类型推断感觉像是很多不必要的工作。为此,您应该学习并理解typings

...坦率地说,我没有完整...所以上面的代码可能是错误的:)

【讨论】:

它澄清了,谢谢。大多数情况下,为了代码的可读性,我会尝试显式键入,但显然,我错了。 附言。 Wrapper&lt;typeof About &amp; Vue&gt; 返回与问题中相同的问题:) Wrapper&lt;InstanceType&lt;typeof About&gt;&gt; 工作 感谢@MauriciAbad

以上是关于TS2749:“XXX”指的是一个值,但在这里被用作一个类型。您的意思是“typeof XXX”吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Electron 15 中将 webContents 声明为 TypeScript

useRef “指的是一个值,但在这里被用作一个类型。”

“导航栏指的是一个值,但在此处用作类型”在测试时尝试呈现我的组件的浅表副本

具有未继承约束的 Django 模型抽象模型:“约束”指的是字段“xxx”,它不是模型“Foo”的本地字段

打字稿:错误 TS2693:“承诺”仅指一种类型,但在此处用作值

POJ2749 Building road