如何解决Vue 3 + TypeScript项目中'Ref<boolean>'类型缺少'value'属性的问题?

旧的vue3+typescript项目,在终端中报

TS2339: Property 'value' does not exist on type 'boolean'.

报错的地方是类似这种操作:

const display = ref(false)
// 此处略去114514行代码
display.value = true

这是个比较老的vue3项目。配置方式甚至依然是用vue.config.js。

通过jenkins发布是正常的,但是在本地运行是有问题的

我尝试过

const display:Ref<boolean> = ref(false)
const display = ref(false) as Ref<boolean>

报错变成了

TS2339: Property 'value' does not exist on type 'Ref<boolean, boolean>'.

————————————————package.json----------------------

{
  "name": "mainweb-renew",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "lint": "vue-cli-service lint"
  },
  "dependencies": {
    "add": "^2.0.6",
    "ant-design-vue": "^3.0.0-alpha.14",
    "axios": "^0.24.0",
    "babel-plugin-import": "^1.13.3",
    "core-js": "^3.6.5",
    "embla-carousel-vue": "^8.2.1",
    "js-cookie": "^3.0.1",
    "pug-plain-loader": "^1.1.0",
    "qs": "^6.10.2",
    "spritesheet-templates": "^10.5.2",
    "style-resources-loader": "^1.5.0",
    "vant": "^4.9.4",
    "vue": "^3.0.0",
    "vue-class-component": "^8.0.0-0",
    "vue-cli-plugin-style-resources-loader": "^0.1.5",
    "vue-router": "^4.0.0-0",
    "yarn": "^1.22.17"
  },
  "devDependencies": {
    "@types/js-cookie": "^3.0.1",
    "@typescript-eslint/eslint-plugin": "^4.18.0",
    "@typescript-eslint/parser": "^4.18.0",
    "@vue/cli-plugin-babel": "~4.5.0",
    "@vue/cli-plugin-eslint": "~4.5.0",
    "@vue/cli-plugin-router": "~4.5.0",
    "@vue/cli-plugin-typescript": "~4.5.0",
    "@vue/cli-service": "~4.5.0",
    "@vue/compiler-sfc": "^3.0.0",
    "@vue/eslint-config-typescript": "^7.0.0",
    "eslint": "^6.7.2",
    "eslint-plugin-vue": "^7.0.0",
    "less": "^3.0.4",
    "less-loader": "^6.0.0",
    "postcss-pxtorem": "5.1.1",
    "pug": "^3.0.2",
    "typescript": "~4.1.5",
    "vconsole": "^3.15.1"
  }
}

------------------------tsconfig.json------------------------

{
  "compilerOptions": {
    "target": "esnext",
    "module": "esnext",
    "strict": false,
    "jsx": "preserve",
    "importHelpers": true,
    "moduleResolution": "node",
    "experimentalDecorators": true,
    "skipLibCheck": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "sourceMap": true,
    "baseUrl": ".",
    "types": [
      "webpack-env"
    ],
    "paths": {
      "@/*": [
        "src/*"
      ]
    },
    "lib": [
      "esnext",
      "dom",
      "dom.iterable",
      "scripthost"
    ]
  },
  "include": [
    "src/**/*.ts",
    "src/**/*.tsx",
    "src/**/*.vue",
    "tests/**/*.ts",
    "tests/**/*.tsx"
  ],
  "exclude": [
    "node_modules"
  ]
}
阅读 1.3k
avatarAI BotBETA

在 Vue 3 + TypeScript 的项目中,当你遇到 'Ref<boolean>' 类型缺少 'value' 属性的问题 时,这通常是因为你的项目中 TypeScript 对 Vue 3 的 Composition API 的类型定义没有正确处理。Ref<T> 类型是 Vue 3 的 Composition API 引入的,用于表示响应式引用,它确实包含一个 value 属性来访问或修改其内部的值。

如果你在使用 ref 时遇到了类型错误,可能是因为以下几个原因:

  1. Vue 3 类型定义未正确安装或更新:确保你的项目中安装了 Vue 3 的类型定义,并且它们是最新的。这通常是通过 @vue/runtime-dom@vue/runtime-core 提供的。
  2. TypeScript 配置问题:检查你的 tsconfig.json 文件,确保 TypeScript 配置能够正确识别 Vue 的类型。
  3. 错误的类型注解:虽然你提供的代码看起来是正确的,但有时候错误的类型注解或者导入错误可以导致这类问题。

解决方案

  1. 确保安装了 Vue 3 的类型定义
    确保你的 package.json 文件中包含了 Vue 3 相关的包,并且它们是最新版本。例如:

    "dependencies": {
      "vue": "^3.x.x",
      "@vue/runtime-dom": "^3.x.x"
    }

注意:通常 @vue/runtime-dom 会自动包含类型定义,但如果你直接从 vue 包导入 Composition API,确保 vue 包也是最新版本。

  1. 检查 TypeScript 配置文件
    确保你的 tsconfig.json 文件中包含了正确的配置,特别是与模块解析相关的设置。
  2. 使用正确的导入和类型注解
    你的代码示例看起来是正确的,但确保你没有从错误的地方导入 ref。通常,它应该从 vue@vue/reactivity(尽管后者在 Vue 3 的官方用法中不太常见)中导入。

    import { ref } from 'vue';
    
    const display = ref(false); // 无需显式类型注解,TypeScript 会自动推断
    
    // 如果你需要显式类型注解(虽然在这个例子中不需要),确保这样做:
    const explicitDisplay: Ref<boolean> = ref(false);
  3. 检查 IDE/编辑器问题
    有时候,IDE 或编辑器可能没有正确加载或解析 TypeScript 配置文件。尝试重启 IDE 或编辑器,或者清理并重建项目。
  4. 查看是否有第三方库冲突
    确保没有第三方库与 Vue 3 的类型定义冲突。这可以通过查看错误消息和堆栈跟踪来确定。

如果以上步骤都无法解决问题,请检查你的项目是否有其他特定的配置或代码问题,这可能需要更详细的审查。

1 个回答

感谢@wzp123321 @zcf0508 同学给出的灵感,我今天不得不再次接手这个项目。然后我把package.json中的
"typescript": "~4.1.5"
改成了
"typescript": "^4.1.5"
然后删除node_modules,重新install就没有这个问题了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Microsoft
子站问答
访问
宣传栏