Skip to content

Commit

Permalink
fix(types): avoid merging object union types when using withDefaults (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
th1m0 authored Apr 15, 2024
1 parent fc99e4d commit 37ba93c
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 1 deletion.
35 changes: 35 additions & 0 deletions packages/dts-test/setupHelpers.test-d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,41 @@ describe('defineProps w/ union type declaration + withDefaults', () => {
)
})

describe('defineProps w/ object union + withDefaults', () => {
const props = withDefaults(
defineProps<
{
foo: string
} & (
| {
type: 'hello'
bar: string
}
| {
type: 'world'
bar: number
}
)
>(),
{
foo: 'default value!',
},
)

expectType<
| {
readonly type: 'hello'
readonly bar: string
readonly foo: string
}
| {
readonly type: 'world'
readonly bar: number
readonly foo: string
}
>(props)
})

describe('defineProps w/ generic type declaration + withDefaults', <T extends
number, TA extends {
a: string
Expand Down
5 changes: 4 additions & 1 deletion packages/runtime-core/src/apiSetupHelpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,9 @@ export function defineModel(): any {
}

type NotUndefined<T> = T extends undefined ? never : T
type MappedOmit<T, K extends keyof any> = {
[P in keyof T as P extends K ? never : P]: T[P]
}

type InferDefaults<T> = {
[K in keyof T]?: InferDefault<T, T[K]>
Expand All @@ -299,7 +302,7 @@ type PropsWithDefaults<
T,
Defaults extends InferDefaults<T>,
BKeys extends keyof T,
> = Readonly<Omit<T, keyof Defaults>> & {
> = Readonly<MappedOmit<T, keyof Defaults>> & {
readonly [K in keyof Defaults]-?: K extends keyof T
? Defaults[K] extends undefined
? T[K]
Expand Down

0 comments on commit 37ba93c

Please sign in to comment.