Skip to content

Commit

Permalink
fix(types/sfc): fix withDefaults type inference when using union types (
Browse files Browse the repository at this point in the history
  • Loading branch information
cathrinevaage authored Nov 15, 2021
1 parent fa2237f commit 04e5835
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 12 deletions.
25 changes: 13 additions & 12 deletions packages/runtime-core/src/apiSetupHelpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -127,20 +127,21 @@ export function defineExpose(exposed?: Record<string, any>) {
type NotUndefined<T> = T extends undefined ? never : T

type InferDefaults<T> = {
[K in keyof T]?: NotUndefined<T[K]> extends
| number
| string
| boolean
| symbol
| Function
? NotUndefined<T[K]>
: (props: T) => NotUndefined<T[K]>
[K in keyof T]?: InferDefault<T, NotUndefined<T[K]>>
}

type PropsWithDefaults<Base, Defaults> = Base &
{
[K in keyof Defaults]: K extends keyof Base ? NotUndefined<Base[K]> : never
}
type InferDefault<P, T> = T extends
| number
| string
| boolean
| symbol
| Function
? T
: (props: P) => T

type PropsWithDefaults<Base, Defaults> = Base & {
[K in keyof Defaults]: K extends keyof Base ? NotUndefined<Base[K]> : never
}

/**
* Vue `<script setup>` compiler macro for providing props default values when
Expand Down
15 changes: 15 additions & 0 deletions test-dts/setupHelpers.test-d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,21 @@ describe('defineProps w/ type declaration + withDefaults', () => {
res.x.slice()
})

describe('defineProps w/ union type declaration + withDefaults', () => {
withDefaults(
defineProps<{
union1?: number | number[] | { x: number }
union2?: number | number[] | { x: number }
union3?: number | number[] | { x: number }
}>(),
{
union1: 123,
union2: () => [123],
union3: () => ({ x: 123 })
}
)
})

describe('defineProps w/ runtime declaration', () => {
// runtime declaration
const props = defineProps({
Expand Down

0 comments on commit 04e5835

Please sign in to comment.