res1.value
})
+describe('withDefaults w/ defineProp discriminate union type', () => {
+ const props = withDefaults(
+ defineProps<
+ { type: 'button'; buttonType?: 'submit' } | { type: 'link'; href: string }
+ >(),
+ {
+ type: 'button',
+ },
+ )
+ if (props.type === 'button') {
+ expectType<'submit' | undefined>(props.buttonType)
+ }
+ if (props.type === 'link') {
+ expectType<string>(props.href)
+ }
+})
+
describe('defineProps w/ runtime declaration', () => {
// runtime declaration
const props = defineProps({
T,
Defaults extends InferDefaults<T>,
BKeys extends keyof T,
-> = Readonly<MappedOmit<T, keyof Defaults>> & {
- readonly [K in keyof Defaults as K extends keyof T
- ? K
- : never]-?: K extends keyof T
- ? Defaults[K] extends undefined
- ? IfAny<Defaults[K], NotUndefined<T[K]>, T[K]>
- : NotUndefined<T[K]>
- : never
-} & {
- readonly [K in BKeys]-?: K extends keyof Defaults
- ? Defaults[K] extends undefined
- ? boolean | undefined
- : boolean
- : boolean
-}
+> = T extends unknown
+ ? Readonly<MappedOmit<T, keyof Defaults>> & {
+ readonly [K in keyof Defaults as K extends keyof T
+ ? K
+ : never]-?: K extends keyof T
+ ? Defaults[K] extends undefined
+ ? IfAny<Defaults[K], NotUndefined<T[K]>, T[K]>
+ : NotUndefined<T[K]>
+ : never
+ } & {
+ readonly [K in BKeys]-?: K extends keyof Defaults
+ ? Defaults[K] extends undefined
+ ? boolean | undefined
+ : boolean
+ : boolean
+ }
+ : never
/**
* Vue `<script setup>` compiler macro for providing props default values when