Nuxt.js Typescript - 当试图访问计算属性中的数据对象时出错。

问题描述 投票:-1回答:1

我正在使用options api,当我试图访问Vue数据对象在一个计算属性中的一个属性时,我在tyechecking中得到一个错误。

Property 'quantity' does not exist on type 'CombinedVueInstance<Vue, unknown, unknown, { item: unknown; total: unknown; menuItemCategories: any; }, Readonly<Record<never, any>>>'

该属性确实存在,因为页面能够使用computed属性正确加载和显示渲染的模板--只有类型检查器在抱怨。

组件代码(因长度而简化)。

import Vue from "vue";
export default Vue.extend({
  data() {
    quantity: 1,
  },

  computed: {
    total() {
      return this.item.price * this.quantity;
    }
  },
});

编辑

我已经能够解决这个问题,通过使用 data 属性作为一个对象。

但这确实会产生一些问题,因为最好的做法是使用 data 作为一个返回对象的函数。同样的问题也适用于 asyncData.

进一步的试验和错误表明,我能够访问的是 data 函数属性,通过 methods 属性。但是如果我使用 mapGetters helper,它抛出的类型错误与计算的属性相同。

methods 也是没有的。CombinedVueInstance 类型在计算的属性里面。

tsconfig.json

// tsconfig.json
{
  "compilerOptions": {
    "target": "es2018",
    "module": "esnext",
    "moduleResolution": "node",
    "lib": [
      "esnext",
      "esnext.asynciterable",
      "dom"
    ],
    "esModuleInterop": true,
    "allowJs": true,
    "sourceMap": true,
    "strict": true,
    "noEmit": true,
    "baseUrl": "./src",
    "paths": {
      "~/*": [
        "./*"
      ],
      "@/*": [
        "./*"
      ]
    },
    "types": [
      "@types/node",
      "@nuxt/types",
      "@nuxtjs/axios"
    ]
  },
  "exclude": [
    "node_modules"
  ]
}

vue-shim.d.ts

declare module "*.vue" {
  import Vue from 'vue'
  export default Vue
}
typescript vue.js vue-component nuxt.js
1个回答
0
投票

Nuxt Typescript的类型检查有一些奇怪的行为,因为它不能正确推断所有的类型。使用Vuex vanilla和helper函数会进一步加剧这种情况。

为了用最少的模板获得完整的类型信息,最好使用 vue-class-componentvue-property-decorator 如图 Nuxt Typescript docs - Components (参见类API),以及基于类的 vuex-module-decorators. 请看 Nuxt Typescript Docs - 存储.

然而,为了回答最初的问题,在使用选项API的同时解决这个问题--你必须为所有函数在 computedmethods并根据需要强制Vuex助手函数。

不幸的是,我们仍然没有得到正确的对 asyncData 因此,我们必须重复我们的代码一个跨 dataasyncData 功能。

import Vue from "vue";
import { mapGetters } from "vuex";

export default Vue.extend({
  // Default component data - supports type checking
  data() {
    return {
      quantity: 1,
    }
  },

  // Actual component data - sourced from api
  async asyncData() {
    const theAwaitedQuantity = // ... some await methods and promises from a backend api
    return {
      quantity: theAwaitedQuantity,
    }
  },

  computed: {
    ...mapGetters(["item"]),

    total(): number {
      // mapped properties from helper functions must have their types coerced.
      return (this.item as ItemType).price * this.quantity;
    }
  },

  methods: {
    someMethod(): string {
      return "methods also need their return type defined";
    }
  }
});

也请看这个相关问题。属性'XXX'在类型'CombinedVueInstance<Vue, {}, {}, {}, Readonly<Record<never, any>>>' 上不存在。

© www.soinside.com 2019 - 2024. All rights reserved.