Skip to content

Commit 842242b

Browse files
committed
feat(types): provide internal options for using refs type in language tools
1 parent d6af694 commit 842242b

3 files changed

Lines changed: 35 additions & 4 deletions

File tree

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

Lines changed: 19 additions & 0 deletions
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', () => {
1761+
type Refs = {
1762+
foo: number
1763+
}
1764+
1765+
const Child = defineComponent({
1766+
__typeRefs: {} as Refs,
1767+
})
1768+
const Parent = defineComponent({
1769+
__typeRefs: {} as { comp1: ComponentInstance<typeof Child> },
1770+
})
1771+
const c = new Parent()
1772+
const refs = c.$refs
1773+
1774+
expectType<number>(refs.comp1.$refs.foo)
1775+
expectType<ComponentInstance<typeof Child>>(refs.comp1)
1776+
})
1777+
17591778
defineComponent({
17601779
props: {
17611780
foo: [String, null],

packages/runtime-core/src/apiDefineComponent.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import type {
1515
GlobalComponents,
1616
GlobalDirectives,
1717
SetupContext,
18+
Data as TypeData,
1819
} from './component'
1920
import type {
2021
ComponentObjectPropsOptions,
@@ -67,6 +68,7 @@ export type DefineComponent<
6768
Exposed extends string = string,
6869
Provide extends ComponentProvideOptions = ComponentProvideOptions,
6970
MakeDefaultsOptional extends boolean = true,
71+
TypeRefs extends TypeData = {},
7072
> = ComponentPublicInstanceConstructor<
7173
CreateComponentPublicInstanceWithMixins<
7274
Props,
@@ -84,7 +86,8 @@ export type DefineComponent<
8486
S,
8587
LC & GlobalComponents,
8688
Directives & GlobalDirectives,
87-
Exposed
89+
Exposed,
90+
TypeRefs
8891
>
8992
> &
9093
ComponentOptionsBase<
@@ -209,6 +212,7 @@ export function defineComponent<
209212
: { [key in RuntimePropsKeys]?: any }
210213
: TypeProps,
211214
ResolvedProps = Readonly<InferredProps & EmitsToProps<ResolvedEmits>>,
215+
TypeRefs extends TypeData = {},
212216
>(
213217
options: {
214218
props?: (RuntimePropsOptions & ThisType<void>) | RuntimePropsKeys[]
@@ -220,6 +224,10 @@ export function defineComponent<
220224
* @private for language-tools use only
221225
*/
222226
__typeEmits?: TypeEmits
227+
/**
228+
* @private for language-tools use only
229+
*/
230+
__typeRefs?: TypeRefs
223231
} & ComponentOptionsBase<
224232
ResolvedProps,
225233
SetupBindings,
@@ -279,7 +287,8 @@ export function defineComponent<
279287
Provide,
280288
// MakeDefaultsOptional - if TypeProps is provided, set to false to use
281289
// user props types verbatim
282-
unknown extends TypeProps ? true : false
290+
unknown extends TypeProps ? true : false,
291+
TypeRefs
283292
>
284293

285294
// implementation, close to no-op

packages/runtime-core/src/componentPublicInstance.ts

Lines changed: 5 additions & 2 deletions
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)