Parcourir la source

fix(types/sfc): improve the type inference using `withDefaults` (#12872)

webfansplz il y a 2 ans
Parent
commit
099401e227
2 fichiers modifiés avec 18 ajouts et 4 suppressions
  1. 13 3
      types/test/setup-helpers-test.ts
  2. 5 1
      types/v3-setup-helpers.d.ts

+ 13 - 3
types/test/setup-helpers-test.ts

@@ -19,15 +19,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'
     }
   )
 
@@ -35,9 +39,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', () => {

+ 5 - 1
types/v3-setup-helpers.d.ts

@@ -110,7 +110,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
 }
 
 /**