Переглянути джерело

fix(types): strip non-prop default values from return type of withDefaults (#9998)

close #9899
yangxiuxiu 1 рік тому
батько
коміт
44973bb3e7

+ 13 - 0
packages-private/dts-test/setupHelpers.test-d.ts

@@ -227,6 +227,19 @@ describe('withDefaults w/ boolean type', () => {
   expectType<boolean | undefined>(res2.bool)
 })
 
+describe('withDefaults w/ defineProp type is different from the defaults type', () => {
+  const res1 = withDefaults(
+    defineProps<{
+      bool?: boolean
+    }>(),
+    { bool: false, value: false },
+  )
+  expectType<boolean>(res1.bool)
+
+  // @ts-expect-error
+  res1.value
+})
+
 describe('defineProps w/ runtime declaration', () => {
   // runtime declaration
   const props = defineProps({

+ 3 - 1
packages/runtime-core/src/apiSetupHelpers.ts

@@ -328,7 +328,9 @@ type PropsWithDefaults<
   Defaults extends InferDefaults<T>,
   BKeys extends keyof T,
 > = Readonly<MappedOmit<T, keyof Defaults>> & {
-  readonly [K in keyof Defaults]-?: K extends keyof T
+  readonly [K in keyof Defaults as K extends keyof T
+    ? K
+    : never]-?: K extends keyof T
     ? Defaults[K] extends undefined
       ? IfAny<Defaults[K], NotUndefined<T[K]>, T[K]>
       : NotUndefined<T[K]>