fix(types/custom-element): `defineCustomElement` with required props (#11578)

This commit is contained in:
Andy Li 2024-08-15 10:28:40 +08:00 committed by Evan You
parent 8bcaad4a32
commit 5e0f6d5f8f
No known key found for this signature in database
GPG Key ID: 00E9AB7A6704CE0A
2 changed files with 37 additions and 4 deletions

View File

@ -99,4 +99,37 @@ describe('defineCustomElement using defineComponent return type', () => {
expectType<number | undefined>(instance.a)
instance.a = 42
})
test('with required props', () => {
const Comp1Vue = defineComponent({
props: {
a: { type: Number, required: true },
},
})
const Comp = defineCustomElement(Comp1Vue)
expectType<VueElementConstructor>(Comp)
const instance = new Comp()
expectType<number>(instance.a)
instance.a = 42
})
test('with default props', () => {
const Comp1Vue = defineComponent({
props: {
a: {
type: Number,
default: 1,
validator: () => true,
},
},
emits: ['click'],
})
const Comp = defineCustomElement(Comp1Vue)
expectType<VueElementConstructor>(Comp)
const instance = new Comp()
expectType<number>(instance.a)
instance.a = 42
})
})

View File

@ -9,6 +9,7 @@ import {
type ComponentOptionsBase,
type ComponentOptionsMixin,
type ComponentProvideOptions,
type ComponentPublicInstance,
type ComputedOptions,
type ConcreteComponent,
type CreateAppFunction,
@ -153,14 +154,13 @@ export function defineCustomElement<
// overload 3: defining a custom element from the returned value of
// `defineComponent`
export function defineCustomElement<
T extends DefineComponent<any, any, any, any>,
// this should be `ComponentPublicInstanceConstructor` but that type is not exported
T extends { new (...args: any[]): ComponentPublicInstance<any> },
>(
options: T,
extraOptions?: CustomElementOptions,
): VueElementConstructor<
T extends DefineComponent<infer P, any, any, any>
? ExtractPropTypes<P>
: unknown
T extends DefineComponent<infer P, any, any, any> ? P : unknown
>
/*! #__NO_SIDE_EFFECTS__ */