我正在使用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
}
Nuxt Typescript的类型检查有一些奇怪的行为,因为它不能正确推断所有的类型。使用Vuex vanilla和helper函数会进一步加剧这种情况。
为了用最少的模板获得完整的类型信息,最好使用 vue-class-component 和 vue-property-decorator 如图 Nuxt Typescript docs - Components (参见类API),以及基于类的 vuex-module-decorators. 请看 Nuxt Typescript Docs - 存储.
然而,为了回答最初的问题,在使用选项API的同时解决这个问题--你必须为所有函数在 computed
和 methods
并根据需要强制Vuex助手函数。
不幸的是,我们仍然没有得到正确的对 asyncData
因此,我们必须重复我们的代码一个跨 data
和 asyncData
功能。
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>>>' 上不存在。