: (props: P) => T
type PropsWithDefaults<Base, Defaults> = Base & {
- [K in keyof Defaults]: K extends keyof Base ? NotUndefined<Base[K]> : never
+ [K in keyof Defaults]: K extends keyof Base
+ ? Defaults[K] extends undefined
+ ? Base[K]
+ : NotUndefined<Base[K]>
+ : never
}
/**
arr?: string[]
obj?: { x: number }
fn?: (e: string) => void
- x?: string
genStr?: string
+ x?: string
+ y?: string
+ z?: string
}>(),
{
number: 123,
arr: () => [],
obj: () => ({ x: 123 }),
fn: () => {},
- genStr: () => ''
+ genStr: () => '',
+ y: undefined,
+ z: 'string'
}
)
res.arr.push('hi')
res.obj.x
res.fn('hi')
+ res.genStr.slice()
// @ts-expect-error
res.x.slice()
- res.genStr.slice()
+ // @ts-expect-error
+ res.y.slice()
+
+ expectType<string | undefined>(res.x)
+ expectType<string | undefined>(res.y)
+ expectType<string>(res.z)
})
describe('defineProps w/ union type declaration + withDefaults', () => {