VSCode中ts-plugin对带setter的计算属性报错问题咨询
问题解答
1. 错误性质:类型推断误报
这是TypeScript类型检查器(配合Vue/Pinia的TS插件)的误报。
运行时能正常赋值是因为你给computed配置了完整的get和set方法,属于可写计算属性;但TS类型系统在推导Pinia store的属性类型时,没能正确识别这个可写性,错误地将myValue判定为只读属性。实际代码逻辑没有问题,只是类型层面的判定偏差。
2. 消除错误提示的方案(无需全局禁用错误)
方案一:显式指定Store返回类型(推荐,从根源解决类型推断问题)
通过手动定义Store的返回类型,明确myValue是Vue的WritableComputedRef类型,让TS正确识别其可写性:
import { defineStore, ref, computed } from 'pinia'; import type { WritableComputedRef } from 'vue'; export class MyClass { myValue: string; } export const useSomeStore = defineStore('someStore', (): { myValue: WritableComputedRef<string> } => { const myClass = ref(new MyClass()); const myValue = computed({ get() { return myClass.value.myValue; }, set(value: string) { myClass.value.myValue = value; } }); return { myValue }; });
方案二:单行代码抑制错误(临时应急用)
如果不想修改Store的类型定义,可以用TS的注释指令单独屏蔽该行的错误提示:
const someStore = useSomeStore(); // @ts-ignore: 忽略TS对myValue只读的误判 someStore.myValue = "hello";
或者更严谨的@ts-expect-error(适合明确知道这是TS误判的场景):
const someStore = useSomeStore(); // @ts-expect-error: TS误判myValue为只读属性 someStore.myValue = "hello";
方案三:优化类属性的类型声明(辅助类型推断)
给MyClass的属性显式添加public修饰符(虽然不是核心原因,但能帮助TS更清晰地识别属性的可写性):
export class MyClass { public myValue: string; }
内容的提问来源于stack exchange,提问作者timbre timbre
相关产品推荐
相关产品推荐

