export type ShallowUnwrapRef<T> = {
[K in keyof T]: T[K] extends Ref<infer V>
- ? V
- : // if `V` is `unknown` that means it does not extend `Ref` and is undefined
- T[K] extends Ref<infer V> | undefined
- ? unknown extends V
- ? undefined
- : V | undefined
- : T[K]
+ ? V // if `V` is `unknown` that means it does not extend `Ref` and is undefined
+ : T[K] extends Ref<infer V> | undefined
+ ? unknown extends V ? undefined : V | undefined
+ : T[K]
}
export type UnwrapRef<T> = T extends ShallowRef<infer V>
| RefUnwrapBailTypes[keyof RefUnwrapBailTypes]
| { [RawSymbol]?: true }
? T
- : T extends Array<any>
+ : T extends ReadonlyArray<any>
? { [K in keyof T]: UnwrapRefSimple<T[K]> }
: T extends object & { [ShallowReactiveMarker]?: never }
? {
-import {
- ref,
- readonly,
- shallowReadonly,
- describe,
- expectError,
- expectType,
- Ref,
- reactive,
- markRaw
-} from './index'
-
-describe('should support DeepReadonly', () => {
- const r = readonly({ obj: { k: 'v' } })
- // @ts-expect-error
- expectError((r.obj = {}))
- // @ts-expect-error
- expectError((r.obj.k = 'x'))
-})
-
-// #4180
-describe('readonly ref', () => {
- const r = readonly(ref({ count: 1 }))
- expectType<Ref>(r)
-})
-
-describe('should support markRaw', () => {
- class Test<T> {
- item = {} as Ref<T>
- }
- const test = new Test<number>()
- const plain = {
- ref: ref(1)
- }
-
- const r = reactive({
- class: {
- raw: markRaw(test),
- reactive: test
- },
- plain: {
- raw: markRaw(plain),
- reactive: plain
- }
- })
-
- expectType<Test<number>>(r.class.raw)
- // @ts-expect-error it should unwrap
- expectType<Test<number>>(r.class.reactive)
-
- expectType<Ref<number>>(r.plain.raw.ref)
- // @ts-expect-error it should unwrap
- expectType<Ref<number>>(r.plain.reactive.ref)
-})
-
-describe('shallowReadonly ref unwrap', () => {
- const r = shallowReadonly({ count: { n: ref(1) } })
- // @ts-expect-error
- r.count = 2
- expectType<Ref>(r.count.n)
- r.count.n.value = 123
-})
+import {\r
+ ref,\r
+ readonly,\r
+ shallowReadonly,\r
+ describe,\r
+ expectError,\r
+ expectType,\r
+ Ref,\r
+ reactive,\r
+ markRaw\r
+} from './index'\r
+\r
+describe('should support DeepReadonly', () => {\r
+ const r = readonly({ obj: { k: 'v' } })\r
+ // @ts-expect-error\r
+ expectError((r.obj = {}))\r
+ // @ts-expect-error\r
+ expectError((r.obj.k = 'x'))\r
+})\r
+\r
+// #4180\r
+describe('readonly ref', () => {\r
+ const r = readonly(ref({ count: 1 }))\r
+ expectType<Ref>(r)\r
+})\r
+\r
+describe('should support markRaw', () => {\r
+ class Test<T> {\r
+ item = {} as Ref<T>\r
+ }\r
+ const test = new Test<number>()\r
+ const plain = {\r
+ ref: ref(1)\r
+ }\r
+\r
+ const r = reactive({\r
+ class: {\r
+ raw: markRaw(test),\r
+ reactive: test\r
+ },\r
+ plain: {\r
+ raw: markRaw(plain),\r
+ reactive: plain\r
+ }\r
+ })\r
+\r
+ expectType<Test<number>>(r.class.raw)\r
+ // @ts-expect-error it should unwrap\r
+ expectType<Test<number>>(r.class.reactive)\r
+\r
+ expectType<Ref<number>>(r.plain.raw.ref)\r
+ // @ts-expect-error it should unwrap\r
+ expectType<Ref<number>>(r.plain.reactive.ref)\r
+})\r
+\r
+describe('shallowReadonly ref unwrap', () => {\r
+ const r = shallowReadonly({ count: { n: ref(1) } })\r
+ // @ts-expect-error\r
+ r.count = 2\r
+ expectType<Ref>(r.count.n)\r
+ r.count.n.value = 123\r
+})\r
+\r
+// #3819\r
+describe('should unwrap tuple correctly', () => {\r
+ const readonlyTuple = [ref(0)] as const\r
+ const reactiveReadonlyTuple = reactive(readonlyTuple)\r
+ expectType<Ref<number>>(reactiveReadonlyTuple[0])\r
+\r
+ const tuple: [Ref<number>] = [ref(0)]\r
+ const reactiveTuple = reactive(tuple)\r
+ expectType<Ref<number>>(reactiveTuple[0])\r
+})\r