【问题标题】:Vue.js 3 and typescript : Property '$store' does not exist on type 'ComponentPublicInstanceVue.js 3 和 typescript:“ComponentPublicInstance”类型上不存在属性“$store”
【发布时间】:2021-02-01 08:07:27
【问题描述】:

找不到任何东西来解决这个看似显而易见的问题。

刚刚从 Vue 2 升级到 Vue 3 和带有 Typescript 的 Vuex。

this.$store 似乎无法访问,尽管遵循了 Vue 3 说明。

src/components/FlashMessages.vue:28:25 中的错误 TS2339:类型“ComponentPublicInstance>'。

    26 |     computed: {
    27 |         getAllFlashMessages (): FlashType {
  > 28 |             return this.$store.getters.getFlashMessages;
       |                         ^^^^^^
    29 |         },
    30 |     },
    31 | 

main.ts

import { createApp } from 'vue'
import App from './App.vue'
import './registerServiceWorker'
import router from './router'
import store from './store'
import './assets/styles/index.css'

const app = createApp(App)

app.use(store)
app.use(router)
app.mount('#app')

store.ts

import { createStore } from 'vuex'
import FlashType from '@/init'

export default createStore({
    state: {
        flashMessages: [] as FlashType[],
    },

    getters: {
        getFlashMessages (state) {
            return state.flashMessages
        }
    },

FlashMessages.vue

<script lang="ts">
import { defineComponent } from "vue";
import FlashType from "@/init";

export default defineComponent({
    name: "FlashMessages",

    data () {
        return {};
    },

    computed: {
        getAllFlashMessages (): FlashType {
            return this.$store.getters.getFlashMessages;
        },
    },

init.ts

export type FlashType = {
    kind: 'success' | 'error';
    message: string;
    time: number;
}

任何智慧都值得赞赏:)

文件结构

├── .editorconfig
├── client
│   ├── babel.config.js
│   ├── CONTRACTS.md
│   ├── cypress.json
│   ├── jest.config.js
│   ├── package.json
│   ├── package-lock.json
│   ├── postcss.config.js
│   ├── public
│   │   ├── favicon.ico
│   │   ├── index.html
│   │   └── robots.txt
│   ├── README.md
│   ├── src
│   │   ├── App.vue
│   │   ├── assets
│   │   │   ├── logo.png
│   │   │   └── styles
│   │   │       └── index.css
│   │   ├── components
│   │   │   ├── admin
│   │   │   │   ├── AdminAdd.vue
│   │   │   │   ├── AdminList.vue
│   │   │   │   ├── AdminWord.vue
│   │   │   │   ├── EmotionAdd.vue
│   │   │   │   ├── EmotionsList.vue
│   │   │   │   └── Emotion.vue
│   │   │   └── FlashMessages.vue
│   │   ├── init.ts
│   │   ├── main.ts
│   │   ├── registerServiceWorker.ts
│   │   ├── router
│   │   │   └── index.ts
│   │   ├── shims-vue.d.ts
│   │   ├── store
│   │   │   └── index.ts
│   │   └── views
│   │       ├── About.vue
│   │       ├── Admin.vue
│   │       ├── Emotions.vue
│   │       └── Home.vue
│   ├── tsconfig.json
│   └── vue.config.js
├
└── server
    ├── api
    ├── api.bundle.js
    ├── index.ts
    ├── logger
    │   └── logger.ts
    ├── models
    ├── nodemon.json
    ├── package.json
    ├── package-lock.json
    ├── router
    │   ├── db.ts
    │   └── emotions.ts
    ├── tsconfig.json
    └── webpack.config.js

这是我第一次正确使用 eslint,所以我不确定我是否设置正确。我最终在 /client 和 /server 目录中使用了不同的 tsconfig。

客户端/tsconfig.json

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

【问题讨论】:

标签: typescript vue.js vuex vuejs3 vuex4


【解决方案1】:

shims-vue.d.ts 文件旁边创建另一个名为shims-vuex.d.ts 的文件,其内容如下:

import { Store } from '@/store';// path to store file

declare module '@vue/runtime-core' {
  interface ComponentCustomProperties {
    $store: Store;
  }
}

更多详情请查看Typescript support 部分

【讨论】:

    【解决方案2】:

    我遇到了类似的错误,但在 VS Code 中。 从 Vuex 4 开始,这是首选方法:

    // vuex-shim.d.ts
    
    import { ComponentCustomProperties } from 'vue'
    import { Store } from 'vuex'
    
    declare module '@vue/runtime-core' {
      // Declare your own store states.
      interface State {
        count: number
      }
    
      interface ComponentCustomProperties {
        $store: Store<State>
      }
    }

    文档:https://next.vuex.vuejs.org/guide/migrating-to-4-0-from-3-x.html#typescript-support

    我不得不再次禁用然后启用 Vetur

    【讨论】:

    • 我做了F1 &gt; Vetur &gt; Restart VLS 这也成功了,但你的回答让我朝着正确的方向前进!
    • 这对我造成了进一步的错误,例如`找不到模块'./App.vue'的声明文件`
    【解决方案3】:

    尝试添加

    app.provide("$store", store);
    

    安装前在您的main.ts 文件中。这个方法对我有用,最终代码看起来像

    ...
    let app = createApp(App);
    app.provide("$store", store);
    app.use(store);
    app.mount("#app");
    

    【讨论】:

      【解决方案4】:

      我做了与上述解决方案相同的事情,但除此之外,我还为应用程序创建了一个 globalProperty。

      import { createApp } from 'vue';
      import App from './App.vue';
      import router from './router';
      import store from './store';
      
      const app = createApp(App);
      app.config.globalProperties.$store = store;
      app.use(router).mount('#app');
      

      【讨论】:

        【解决方案5】:

        Vuex 没有为 this.$store 属性提供开箱即用的类型。与 TypeScript 一起使用时,您必须声明自己的模块扩充。 Reference

        【讨论】:

          猜你喜欢
          • 2021-08-26
          • 2021-03-22
          • 2018-04-25
          • 2023-04-02
          • 2018-08-17
          • 1970-01-01
          • 2023-02-06
          • 2019-03-07
          • 1970-01-01
          相关资源
          最近更新 更多