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
|
describe('defineProps w/ generic type declaration + withDefaults', <T extends
|
||||||
number, TA extends {
|
number, TA extends {
|
||||||
a: string
|
a: string
|
||||||
|
|
|
@ -284,6 +284,9 @@ export function defineModel(): any {
|
||||||
}
|
}
|
||||||
|
|
||||||
type NotUndefined<T> = T extends undefined ? never : T
|
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> = {
|
type InferDefaults<T> = {
|
||||||
[K in keyof T]?: InferDefault<T, T[K]>
|
[K in keyof T]?: InferDefault<T, T[K]>
|
||||||
|
@ -299,7 +302,7 @@ type PropsWithDefaults<
|
||||||
T,
|
T,
|
||||||
Defaults extends InferDefaults<T>,
|
Defaults extends InferDefaults<T>,
|
||||||
BKeys extends keyof T,
|
BKeys extends keyof T,
|
||||||
> = Readonly<Omit<T, keyof Defaults>> & {
|
> = Readonly<MappedOmit<T, keyof Defaults>> & {
|
||||||
readonly [K in keyof Defaults]-?: K extends keyof T
|
readonly [K in keyof Defaults]-?: K extends keyof T
|
||||||
? Defaults[K] extends undefined
|
? Defaults[K] extends undefined
|
||||||
? T[K]
|
? T[K]
|
||||||
|
|
Loading…
Reference in New Issue