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

  • 当 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.aa

console.log(num); // 0


回答:

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

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


回答:

const obj: IObj 这样试试

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


回答:

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

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>).value

console.log(num);

以上是 因为 vue 的 reactive 对象会自动对 ref 对象进行解包,所以导致了 ts 报错,有什么解决方法吗? 的全部内容, 来源链接: utcz.com/p/935169.html

回到顶部