Skip to content

Commit 5ffd1a8

Browse files
authored
feat(types): provide internal options for using refs type in language tools (#11492)
1 parent ba20929 commit 5ffd1a8

File tree

3 files changed

+34
-4
lines changed

3 files changed

+34
-4
lines changed

packages/dts-test/defineComponent.test-d.tsx

+19
Original file line numberDiff line numberDiff line change
@@ -1593,6 +1593,7 @@ describe('expose typing', () => {
15931593
import type {
15941594
AllowedComponentProps,
15951595
ComponentCustomProps,
1596+
ComponentInstance,
15961597
ComponentOptionsMixin,
15971598
DefineComponent,
15981599
Directive,
@@ -1756,6 +1757,24 @@ describe('__typeEmits backdoor, call signature syntax', () => {
17561757
c.$emit('update', 123)
17571758
})
17581759

1760+
describe('__typeRefs backdoor, object syntax', () => {
1761+
type Refs = {
1762+
foo: number
1763+
}
1764+
1765+
const Parent = defineComponent({
1766+
__typeRefs: {} as { child: ComponentInstance<typeof Child> },
1767+
})
1768+
const Child = defineComponent({
1769+
__typeRefs: {} as Refs,
1770+
})
1771+
const c = new Parent()
1772+
const refs = c.$refs
1773+
1774+
expectType<ComponentInstance<typeof Child>>(refs.child)
1775+
expectType<number>(refs.child.$refs.foo)
1776+
})
1777+
17591778
defineComponent({
17601779
props: {
17611780
foo: [String, null],

packages/runtime-core/src/apiDefineComponent.ts

+10-2
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ export type DefineComponent<
6767
Exposed extends string = string,
6868
Provide extends ComponentProvideOptions = ComponentProvideOptions,
6969
MakeDefaultsOptional extends boolean = true,
70+
TypeRefs extends Record<string, unknown> = {},
7071
> = ComponentPublicInstanceConstructor<
7172
CreateComponentPublicInstanceWithMixins<
7273
Props,
@@ -84,7 +85,8 @@ export type DefineComponent<
8485
S,
8586
LC & GlobalComponents,
8687
Directives & GlobalDirectives,
87-
Exposed
88+
Exposed,
89+
TypeRefs
8890
>
8991
> &
9092
ComponentOptionsBase<
@@ -209,6 +211,7 @@ export function defineComponent<
209211
: { [key in RuntimePropsKeys]?: any }
210212
: TypeProps,
211213
ResolvedProps = Readonly<InferredProps & EmitsToProps<ResolvedEmits>>,
214+
TypeRefs extends Record<string, unknown> = {},
212215
>(
213216
options: {
214217
props?: (RuntimePropsOptions & ThisType<void>) | RuntimePropsKeys[]
@@ -220,6 +223,10 @@ export function defineComponent<
220223
* @private for language-tools use only
221224
*/
222225
__typeEmits?: TypeEmits
226+
/**
227+
* @private for language-tools use only
228+
*/
229+
__typeRefs?: TypeRefs
223230
} & ComponentOptionsBase<
224231
ResolvedProps,
225232
SetupBindings,
@@ -279,7 +286,8 @@ export function defineComponent<
279286
Provide,
280287
// MakeDefaultsOptional - if TypeProps is provided, set to false to use
281288
// user props types verbatim
282-
unknown extends TypeProps ? true : false
289+
unknown extends TypeProps ? true : false,
290+
TypeRefs
283291
>
284292

285293
// implementation, close to no-op

packages/runtime-core/src/componentPublicInstance.ts

+5-2
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,7 @@ export type CreateComponentPublicInstanceWithMixins<
232232
LC extends Record<string, Component> = {},
233233
Directives extends Record<string, Directive> = {},
234234
Exposed extends string = string,
235+
TypeRefs extends Data = {},
235236
Provide extends ComponentProvideOptions = ComponentProvideOptions,
236237
// mixin inference
237238
PublicMixin = IntersectionMixin<Mixin> & IntersectionMixin<Extends>,
@@ -275,7 +276,8 @@ export type CreateComponentPublicInstanceWithMixins<
275276
>,
276277
I,
277278
S,
278-
Exposed
279+
Exposed,
280+
TypeRefs
279281
>
280282

281283
export type ExposedKeys<
@@ -299,14 +301,15 @@ export type ComponentPublicInstance<
299301
I extends ComponentInjectOptions = {},
300302
S extends SlotsType = {},
301303
Exposed extends string = '',
304+
TypeRefs extends Data = {},
302305
> = {
303306
$: ComponentInternalInstance
304307
$data: D
305308
$props: MakeDefaultsOptional extends true
306309
? Partial<Defaults> & Omit<Prettify<P> & PublicProps, keyof Defaults>
307310
: Prettify<P> & PublicProps
308311
$attrs: Data
309-
$refs: Data
312+
$refs: Data & TypeRefs
310313
$slots: UnwrapSlotsType<S>
311314
$root: ComponentPublicInstance | null
312315
$parent: ComponentPublicInstance | null

0 commit comments

Comments
 (0)