fix(types): avoid merging object union types when using withDefaults (#10596)

close #10594
This commit is contained in:
Thimo Sietsma 2024-04-15 16:50:34 +02:00 committed by GitHub
parent fc99e4d3f0
commit 37ba93c213
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 39 additions and 1 deletions

View File

@ -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

View File

@ -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]>
@ -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]