import { ComponentObjectPropsOptions, ExtractPropTypes } from './componentProps'
import { warn } from './warning'
+type InferDefaults<T> = {
+ [K in keyof T]?: NonNullable<T[K]> extends object
+ ? () => NonNullable<T[K]>
+ : NonNullable<T[K]>
+}
+
/**
* Compile-time-only helper used for declaring props inside `<script setup>`.
* This is stripped away in the compiled code and should never be actually
TypeProps = undefined,
PP extends ComponentObjectPropsOptions = ComponentObjectPropsOptions,
InferredProps = ExtractPropTypes<PP>
->(props?: PP): Readonly<TypeProps extends undefined ? InferredProps : TypeProps>
+>(
+ props?: PP,
+ defaults?: InferDefaults<TypeProps>
+): Readonly<TypeProps extends undefined ? InferredProps : TypeProps>
// implementation
export function defineProps() {
if (__DEV__) {
runtimeError.value = 'Uncaught (in promise): ' + error.message
},
on_console: (log: any) => {
+ if (log.duplicate) {
+ return
+ }
if (log.level === 'error') {
if (log.args[0] instanceof Error) {
runtimeError.value = log.args[0].message
}
async function updatePreview() {
- console.clear()
+ // @ts-ignore
+ if (import.meta.env.PROD) {
+ console.clear()
+ }
runtimeError.value = null
runtimeWarning.value = null
try {
props.bar
})
+describe('defineProps w/ type declaration + defaults', () => {
+ defineProps<{
+ number?: number
+ arr?: string[]
+ arr2?: string[]
+ obj?: { x: number }
+ obj2?: { x: number }
+ obj3?: { x: number }
+ }>(
+ {},
+ {
+ number: 1,
+
+ arr: () => [''],
+ // @ts-expect-error not using factory
+ arr2: [''],
+
+ obj: () => ({ x: 123 }),
+ // @ts-expect-error not using factory
+ obj2: { x: 123 },
+ // @ts-expect-error factory return type does not match
+ obj3: () => ({ x: 'foo' })
+ }
+ )
+})
+
describe('defineProps w/ runtime declaration', () => {
// runtime declaration
const props = defineProps({