import type {
AllowedComponentProps,
ComponentCustomProps,
+ ComponentInstance,
ComponentOptionsMixin,
DefineComponent,
Directive,
c.$emit('update', 123)
})
+describe('__typeRefs backdoor, object syntax', () => {
+ type Refs = {
+ foo: number
+ }
+
+ const Parent = defineComponent({
+ __typeRefs: {} as { child: ComponentInstance<typeof Child> },
+ })
+ const Child = defineComponent({
+ __typeRefs: {} as Refs,
+ })
+ const c = new Parent()
+ const refs = c.$refs
+
+ expectType<ComponentInstance<typeof Child>>(refs.child)
+ expectType<number>(refs.child.$refs.foo)
+})
+
defineComponent({
props: {
foo: [String, null],
Exposed extends string = string,
Provide extends ComponentProvideOptions = ComponentProvideOptions,
MakeDefaultsOptional extends boolean = true,
+ TypeRefs extends Record<string, unknown> = {},
> = ComponentPublicInstanceConstructor<
CreateComponentPublicInstanceWithMixins<
Props,
S,
LC & GlobalComponents,
Directives & GlobalDirectives,
- Exposed
+ Exposed,
+ TypeRefs
>
> &
ComponentOptionsBase<
: { [key in RuntimePropsKeys]?: any }
: TypeProps,
ResolvedProps = Readonly<InferredProps & EmitsToProps<ResolvedEmits>>,
+ TypeRefs extends Record<string, unknown> = {},
>(
options: {
props?: (RuntimePropsOptions & ThisType<void>) | RuntimePropsKeys[]
* @private for language-tools use only
*/
__typeEmits?: TypeEmits
+ /**
+ * @private for language-tools use only
+ */
+ __typeRefs?: TypeRefs
} & ComponentOptionsBase<
ResolvedProps,
SetupBindings,
Provide,
// MakeDefaultsOptional - if TypeProps is provided, set to false to use
// user props types verbatim
- unknown extends TypeProps ? true : false
+ unknown extends TypeProps ? true : false,
+ TypeRefs
>
// implementation, close to no-op
LC extends Record<string, Component> = {},
Directives extends Record<string, Directive> = {},
Exposed extends string = string,
+ TypeRefs extends Data = {},
Provide extends ComponentProvideOptions = ComponentProvideOptions,
// mixin inference
PublicMixin = IntersectionMixin<Mixin> & IntersectionMixin<Extends>,
>,
I,
S,
- Exposed
+ Exposed,
+ TypeRefs
>
export type ExposedKeys<
I extends ComponentInjectOptions = {},
S extends SlotsType = {},
Exposed extends string = '',
+ TypeRefs extends Data = {},
> = {
$: ComponentInternalInstance
$data: D
? Partial<Defaults> & Omit<Prettify<P> & PublicProps, keyof Defaults>
: Prettify<P> & PublicProps
$attrs: Data
- $refs: Data
+ $refs: Data & TypeRefs
$slots: UnwrapSlotsType<S>
$root: ComponentPublicInstance | null
$parent: ComponentPublicInstance | null