]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(sfc/types): improve the type inference using withDefaults (#6764)
authorlittleboarx <59130959+littleboarx@users.noreply.github.com>
Tue, 8 Nov 2022 02:59:31 +0000 (10:59 +0800)
committerGitHub <noreply@github.com>
Tue, 8 Nov 2022 02:59:31 +0000 (21:59 -0500)
fix #6552

packages/runtime-core/src/apiSetupHelpers.ts
test-dts/setupHelpers.test-d.ts

index a8b7fcdef31f8224b88dbfc28205ea0211489884..0ab3d252d553bf12e151356d69bef52de8db4946 100644 (file)
@@ -143,7 +143,11 @@ type InferDefault<P, T> = T extends
   : (props: P) => T
 
 type PropsWithDefaults<Base, Defaults> = Base & {
-  [K in keyof Defaults]: K extends keyof Base ? NotUndefined<Base[K]> : never
+  [K in keyof Defaults]: K extends keyof Base
+    ? Defaults[K] extends undefined
+      ? Base[K]
+      : NotUndefined<Base[K]>
+    : never
 }
 
 /**
index 6b9c67b28978e6685a9ff310ca47e936910a6163..d099d37441d6419f7bbe4b47bdbdc2abee65a21e 100644 (file)
@@ -27,15 +27,19 @@ describe('defineProps w/ type declaration + withDefaults', () => {
       arr?: string[]
       obj?: { x: number }
       fn?: (e: string) => void
-      x?: string
       genStr?: string
+      x?: string
+      y?: string
+      z?: string
     }>(),
     {
       number: 123,
       arr: () => [],
       obj: () => ({ x: 123 }),
       fn: () => {},
-      genStr: () => ''
+      genStr: () => '',
+      y: undefined,
+      z: 'string'
     }
   )
 
@@ -43,9 +47,15 @@ describe('defineProps w/ type declaration + withDefaults', () => {
   res.arr.push('hi')
   res.obj.x
   res.fn('hi')
+  res.genStr.slice()
   // @ts-expect-error
   res.x.slice()
-  res.genStr.slice()
+  // @ts-expect-error
+  res.y.slice()
+
+  expectType<string | undefined>(res.x)
+  expectType<string | undefined>(res.y)
+  expectType<string>(res.z)
 })
 
 describe('defineProps w/ union type declaration + withDefaults', () => {