]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
types: fix ref unwrapping when nested inside arrays (#331)
author扩散性百万甜面包 <himself65@outlook.com>
Fri, 18 Oct 2019 18:54:05 +0000 (02:54 +0800)
committerEvan You <yyx990803@gmail.com>
Fri, 18 Oct 2019 18:54:05 +0000 (14:54 -0400)
packages/reactivity/__tests__/ref.spec.ts
packages/reactivity/src/ref.ts

index f2f02e10470f11399590a705d76ca03f34db842a..89832ad6367d8ee3d6d4d2bcc24448b8e0aaa91f 100644 (file)
@@ -80,6 +80,25 @@ describe('reactivity/ref', () => {
     expect(typeof (c.value.b + 1)).toBe('number')
   })
 
+  it('should properly unwrap ref types nested inside arrays', () => {
+    const arr = ref([1, ref(1)]).value
+    // should unwrap to number[]
+    arr[0]++
+    arr[1]++
+
+    const arr2 = ref([1, new Map<string, any>(), ref('1')]).value
+    const value = arr2[0]
+    if (typeof value === 'string') {
+      value + 'foo'
+    } else if (typeof value === 'number') {
+      value + 1
+    } else {
+      // should narrow down to Map type
+      // and not contain any Ref type
+      value.has('foo')
+    }
+  })
+
   test('isRef', () => {
     expect(isRef(ref(1))).toBe(true)
     expect(isRef(computed(() => 1))).toBe(true)
index 24fabbc869ef33ec1544051e7764fe46da8e75f0..795be28b4f5180bddfe4cec3af060f7aff156843 100644 (file)
@@ -74,7 +74,6 @@ export type UnwrapRef<T> = {
   ref: T extends Ref<infer V> ? UnwrapRef<V> : T
   array: T extends Array<infer V> ? Array<UnwrapRef<V>> : T
   object: { [K in keyof T]: UnwrapRef<T[K]> }
-  stop: T
 }[T extends ComputedRef<any>
   ? 'cRef'
   : T extends Ref
@@ -82,5 +81,5 @@ export type UnwrapRef<T> = {
     : T extends Array<any>
       ? 'array'
       : T extends BailTypes
-        ? 'stop' // bail out on types that shouldn't be unwrapped
-        : T extends object ? 'object' : 'stop']
+        ? 'ref' // bail out on types that shouldn't be unwrapped
+        : T extends object ? 'object' : 'ref']