当前位置: 首页 > 知识库问答 >
问题:

vue.js - 因为 vue 的 reactive 对象会自动对 ref 对象进行解包,所以导致了 ts 报错,有什么解决方法吗?

云和同
2023-11-23
  • 当 ref 对象作为 reactive 对象的属性,在定义 reactive 对象获取其类型时或读取 reactive 对象的 ref 属性时都会对 ref 对象进行自动的解包,因此就出现了以下的 ts 报错
  • 实际上下面的两个报错都是符合 vue 的特性的,并没有问题
  • 有没有什么办法可以让这两种情况可以正确的识别类型,或者说可以让这两种情况不报错(之前一种用 as any 和 as unknown as xxx 来解决,感觉是在是太丑陋了)
import type { Ref } from 'vue'import {ref, reactive} from 'vue'interface IObj {    count: Ref<number> | null;    arr: {        // 如果是这种自定义属性的对象类型则不会在 reactive 返回值的类型中进行解包        [key:string]: Ref<number>    } | null;    o?: {        oo: Ref<number>    }}const obj = reactive<IObj>({    count: null,    arr: null})/*reactive 返回值的类型 const obj: {    count: number | null;    arr: {        [key: string]: Ref<number>;    } | null;    o?: {        oo: number;    } | undefined;}*/// 这里ts报错: 不能将类型“Ref<number>”分配给类型“number”obj.count = ref(1)obj.arr = {    aa: ref(0),    bb: ref(1)}// 这里ts报错: 不能将类型“Ref<number>”分配给类型“number”let num:number = obj.arr.aaconsole.log(num); // 0

共有3个答案

廖诚
2023-11-23

目前没什么好的方式, 你可以追踪下这两个issue:

https://github.com/vuejs/core/issues/3478
https://github.com/microsoft/TypeScript/issues/43826

翁阳曜
2023-11-23

不知道这样能不能满足你的需求:

import type { Ref } from 'vue'import {ref, reactive} from 'vue'interface IObj {    count: Ref<number> | null;    arr: {        [key:string]: Ref<number>    } | null;    o?: {        oo: Ref<number>    }}const obj:IObj = reactive({    count: null,    arr: null})obj.count = ref(1)obj.arr = {    aa: ref(0),    bb: ref(1)}let num:number = (obj.arr.aa as Ref<number>).valueconsole.log(num); 
严正诚
2023-11-23

const obj: IObj 这样试试

不推荐使用 reactive() 的泛型参数,因为处理了深层次 ref 解包的返回值与泛型参数的类型不同。

 类似资料:
  • 如图,这个status是一个状态字段,我这样定义的结构,他可以为空或者一些数字,在我赋值给这个字段ts会给警告,我知道可以在reactive<>里声明,但这样的话我就需要给每个字段都声明类型,觉得很繁琐,请问你们项目中是怎么处理的

  • 本文向大家介绍sqlserver 因为选定的用户拥有对象,所以无法除去该用户的解决方法,包括了sqlserver 因为选定的用户拥有对象,所以无法除去该用户的解决方法的使用技巧和注意事项,需要的朋友参考一下 现象: 把之前备份的数据库还原到现在的SQL数据库中,现在要把数据库中的用户删除掉,结果却提示: 因为选定的用户拥有对象,所以无法除去该用户 解决办法: 1.打开企业管理器,展开服务器,右键点

  • 我从accuweather获得了以下带有json的代码 我尝试通过Jackson将此对象解析为POJO 我有json中指定的所有模型,如、数组、,由组成(在json中命名为最小值和最大值)等,它们都有私有字段和公共构造函数、getter和setter。但是我没有一些字段,因为我想省略它们(Day、night、EpochDate、Source)。 当我运行程序时,我得到了错误 com.fasterx

  • 问题内容: 好的,这是一个棘手的问题。我有一套清单。我想按顺序对集合中的对象进行排序。 想象每个场景都压抑着学校的一堂课。每个集合包含人物对象。人员对象具有名称的字符串值。在遍历并写下来之前,我想按名称排列集合中的人物。 是否有任何使用或类似的方法可以实现此目的? 我确实知道班上2个以上的孩子可能使用相同的名字,但请忽略此 问题答案: A 没有 排序的 概念,因为它是一个集合。 您可以使用按类实现

  • 问题内容: 嗨,我有一个使用自定义格式字符串设置的简单日期格式:MMddyy 我给它解析以下值:4 1 01 我认为它不应该因为空格而解析,但是“简单日期格式”会返回日期 0001AD年4月4日 有什么想法吗? 问题答案: 这是预期的行为-您告诉DateFormat对象期望日期的6个字符的String表示形式,这就是您传递的内容。对空格进行了解析。但是,如果您使用“ 4x1x01”,则会出现错误。

  • 本文向大家介绍全面了解JavaScript对象进阶,包括了全面了解JavaScript对象进阶的使用技巧和注意事项,需要的朋友参考一下 要了解JavaScript对象,我们可以从对象创建、属性操作、对象方法这几个方面入手。概括起来,包括以下几模块:   1.创建对象 1.1 对象直接量 对象直接量是创建对象最简单的方式,由若干名/值对组成映射表: 属性名也没有什么限制,可以是js的关键字或者任意字