]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
feat(types): provide internal options for using refs type in language tools (#11492)
authorTycho <jh.leong@outlook.com>
Mon, 5 Aug 2024 02:50:43 +0000 (10:50 +0800)
committerGitHub <noreply@github.com>
Mon, 5 Aug 2024 02:50:43 +0000 (10:50 +0800)
packages/dts-test/defineComponent.test-d.tsx
packages/runtime-core/src/apiDefineComponent.ts
packages/runtime-core/src/componentPublicInstance.ts

index 79c2e677d2df5583ca9f550e6c1254080e188d84..810310bac84d5478545745e878f92f2d7aa44952 100644 (file)
@@ -1593,6 +1593,7 @@ describe('expose typing', () => {
 import type {
   AllowedComponentProps,
   ComponentCustomProps,
+  ComponentInstance,
   ComponentOptionsMixin,
   DefineComponent,
   Directive,
@@ -1756,6 +1757,24 @@ describe('__typeEmits backdoor, call signature syntax', () => {
   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],
index 98e9ae7952cd8cb8d994a6e4f1491395777c6dd7..0dde68f888ccac02fb71a1f21c1f0cf456ce4efa 100644 (file)
@@ -67,6 +67,7 @@ export type DefineComponent<
   Exposed extends string = string,
   Provide extends ComponentProvideOptions = ComponentProvideOptions,
   MakeDefaultsOptional extends boolean = true,
+  TypeRefs extends Record<string, unknown> = {},
 > = ComponentPublicInstanceConstructor<
   CreateComponentPublicInstanceWithMixins<
     Props,
@@ -84,7 +85,8 @@ export type DefineComponent<
     S,
     LC & GlobalComponents,
     Directives & GlobalDirectives,
-    Exposed
+    Exposed,
+    TypeRefs
   >
 > &
   ComponentOptionsBase<
@@ -209,6 +211,7 @@ export function defineComponent<
       : { [key in RuntimePropsKeys]?: any }
     : TypeProps,
   ResolvedProps = Readonly<InferredProps & EmitsToProps<ResolvedEmits>>,
+  TypeRefs extends Record<string, unknown> = {},
 >(
   options: {
     props?: (RuntimePropsOptions & ThisType<void>) | RuntimePropsKeys[]
@@ -220,6 +223,10 @@ export function defineComponent<
      * @private for language-tools use only
      */
     __typeEmits?: TypeEmits
+    /**
+     * @private for language-tools use only
+     */
+    __typeRefs?: TypeRefs
   } & ComponentOptionsBase<
     ResolvedProps,
     SetupBindings,
@@ -279,7 +286,8 @@ export function defineComponent<
   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
index 41fce67d0c5c61af55abd23f5ee3525ba41b9338..9ab6df52d6d795855e741cb5861dca675e2e035e 100644 (file)
@@ -232,6 +232,7 @@ export type CreateComponentPublicInstanceWithMixins<
   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>,
@@ -275,7 +276,8 @@ export type CreateComponentPublicInstanceWithMixins<
   >,
   I,
   S,
-  Exposed
+  Exposed,
+  TypeRefs
 >
 
 export type ExposedKeys<
@@ -299,6 +301,7 @@ export type ComponentPublicInstance<
   I extends ComponentInjectOptions = {},
   S extends SlotsType = {},
   Exposed extends string = '',
+  TypeRefs extends Data = {},
 > = {
   $: ComponentInternalInstance
   $data: D
@@ -306,7 +309,7 @@ export type ComponentPublicInstance<
     ? 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