]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
types(defineComponent): fix unwrap when returning `Ref<T>|undefined` from `setup...
authorCarlos Rodrigues <david-181@hotmail.com>
Thu, 15 Jul 2021 19:58:20 +0000 (20:58 +0100)
committerGitHub <noreply@github.com>
Thu, 15 Jul 2021 19:58:20 +0000 (15:58 -0400)
packages/reactivity/src/ref.ts
test-dts/component.test-d.ts

index 0414ece2e5a3421eb66db3511808247658463578..3d1f1453ca1fc922e3865ccb00f187003f629085 100644 (file)
@@ -205,7 +205,11 @@ type BaseTypes = string | number | boolean
 export interface RefUnwrapBailTypes {}
 
 export type ShallowUnwrapRef<T> = {
-  [K in keyof T]: T[K] extends Ref<infer V> ? V : T[K]
+  [K in keyof T]: T[K] extends Ref<infer V>
+    ? V
+    : T[K] extends Ref<infer V> | undefined // if `V` is `unknown` that means it does not extend `Ref` and is undefined
+      ? unknown extends V ? undefined : V | undefined
+      : T[K]
 }
 
 export type UnwrapRef<T> = T extends Ref<infer V>
index e679ffa6a4034f6e6bc45b631480bc008da5986b..93c3ea4109cfed2b5c990be6442f689b7e11767a 100644 (file)
@@ -159,6 +159,7 @@ describe('object props', () => {
           setupC: {
             a: ref(2)
           },
+          setupD: undefined as Ref<number> | undefined,
           setupProps: props
         }
       }
@@ -190,7 +191,7 @@ describe('object props', () => {
     expectType<Number>(rawBindings.setupA)
     expectType<Ref<Number>>(rawBindings.setupB)
     expectType<Ref<Number>>(rawBindings.setupC.a)
-    expectType<Number>(rawBindings.setupA)
+    expectType<Ref<Number> | undefined>(rawBindings.setupD)
 
     // raw bindings props
     expectType<ExpectedProps['a']>(rawBindings.setupProps.a)
@@ -215,7 +216,7 @@ describe('object props', () => {
     expectType<Number>(setup.setupA)
     expectType<Number>(setup.setupB)
     expectType<Ref<Number>>(setup.setupC.a)
-    expectType<Number>(setup.setupA)
+    expectType<number | undefined>(setup.setupD)
 
     // raw bindings props
     expectType<ExpectedProps['a']>(setup.setupProps.a)
@@ -239,6 +240,7 @@ describe('object props', () => {
     // instance
     const instance = new MyComponent()
     expectType<number>(instance.setupA)
+    expectType<number | undefined>(instance.setupD)
     // @ts-expect-error
     instance.notExist
   })