@@ -58,7 +58,13 @@ export function defineProps<
5858 PP extends ComponentObjectPropsOptions = ComponentObjectPropsOptions
5959> ( props : PP ) : Readonly < ExtractPropTypes < PP > >
6060// overload 3: typed-based declaration
61- export function defineProps < TypeProps > ( ) : Readonly < TypeProps >
61+ export function defineProps < TypeProps > ( ) : Readonly <
62+ Omit < TypeProps , BooleanKey < TypeProps > > & {
63+ [ K in keyof Pick < TypeProps , BooleanKey < TypeProps > > ] -?: NotUndefined <
64+ TypeProps [ K ]
65+ >
66+ }
67+ >
6268// implementation
6369export function defineProps ( ) {
6470 if ( __DEV__ ) {
@@ -128,6 +134,12 @@ export function defineExpose<
128134
129135type NotUndefined < T > = T extends undefined ? never : T
130136
137+ type BooleanKey < T , K extends keyof T = keyof T > = K extends any
138+ ? [ T [ K ] ] extends [ boolean | undefined ]
139+ ? K
140+ : never
141+ : never
142+
131143type InferDefaults < T > = {
132144 [ K in keyof T ] ?: InferDefault < T , NotUndefined < T [ K ] > >
133145}
@@ -142,14 +154,27 @@ type InferDefault<P, T> = T extends
142154 ? T | ( ( props : P ) => T )
143155 : ( props : P ) => T
144156
145- type PropsWithDefaults < Base , Defaults > = Base & {
146- [ K in keyof Defaults ] : K extends keyof Base
157+ type PropsWithDefaults < Base , Defaults > = {
158+ [ K in keyof Base as K extends keyof Defaults
147159 ? Defaults [ K ] extends undefined
148- ? Base [ K ]
149- : NotUndefined < Base [ K ] >
150- : never
151- }
152-
160+ ? never
161+ : K
162+ : K ] : Base [ K ]
163+ } & {
164+ [ K in keyof Base as K extends keyof Defaults
165+ ? Defaults [ K ] extends undefined
166+ ? K
167+ : never
168+ : never ] ?: Base [ K ] | undefined
169+ } & Readonly < {
170+ [ K in keyof Defaults as Defaults [ K ] extends undefined
171+ ? never
172+ : K ] : K extends keyof Base
173+ ? Defaults [ K ] extends undefined
174+ ? Base [ K ]
175+ : NotUndefined < Base [ K ] >
176+ : never
177+ } >
153178/**
154179 * Vue `<script setup>` compiler macro for providing props default values when
155180 * using type-based `defineProps` declaration.
0 commit comments