)
})
+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
}
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]>
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]