@@ -58,7 +58,13 @@ export function defineProps<
58
58
PP extends ComponentObjectPropsOptions = ComponentObjectPropsOptions
59
59
> ( props : PP ) : Readonly < ExtractPropTypes < PP > >
60
60
// 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
+ >
62
68
// implementation
63
69
export function defineProps ( ) {
64
70
if ( __DEV__ ) {
@@ -128,6 +134,12 @@ export function defineExpose<
128
134
129
135
type NotUndefined < T > = T extends undefined ? never : T
130
136
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
+
131
143
type InferDefaults < T > = {
132
144
[ K in keyof T ] ?: InferDefault < T , NotUndefined < T [ K ] > >
133
145
}
@@ -142,14 +154,27 @@ type InferDefault<P, T> = T extends
142
154
? T | ( ( props : P ) => T )
143
155
: ( props : P ) => T
144
156
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
147
159
? 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
+ } >
153
178
/**
154
179
* Vue `<script setup>` compiler macro for providing props default values when
155
180
* using type-based `defineProps` declaration.
0 commit comments