mirror of https://github.com/vuejs/core.git
fix(types): avoid merging object union types when using withDefaults (#10596)
close #10594
This commit is contained in:
parent
fc99e4d3f0
commit
37ba93c213
|
@ -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
|
||||
|
|
|
@ -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]
|
||||
|
|
Loading…
Reference in New Issue