Skip to content

Commit afbd302

Browse files
committed
fix
1 parent 30399d4 commit afbd302

File tree

2 files changed

+38
-8
lines changed

2 files changed

+38
-8
lines changed

packages/runtime-core/src/apiSetupHelpers.ts

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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
6369
export function defineProps() {
6470
if (__DEV__) {
@@ -128,6 +134,12 @@ export function defineExpose<
128134

129135
type 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+
131143
type 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.

test-dts/setupHelpers.test-d.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ describe('defineProps w/ type declaration + withDefaults', () => {
3131
x?: string
3232
y?: string
3333
z?: string
34+
bool?: boolean
35+
boolAndUndefined: boolean | undefined
3436
}>(),
3537
{
3638
number: 123,
@@ -56,6 +58,9 @@ describe('defineProps w/ type declaration + withDefaults', () => {
5658
expectType<string | undefined>(res.x)
5759
expectType<string | undefined>(res.y)
5860
expectType<string>(res.z)
61+
62+
expectType<boolean>(res.bool)
63+
expectType<boolean>(res.boolAndUndefined)
5964
})
6065

6166
describe('defineProps w/ union type declaration + withDefaults', () => {

0 commit comments

Comments
 (0)