Skip to content

Commit 6cb4b3b

Browse files
committed
wip
1 parent 74fbec8 commit 6cb4b3b

File tree

2 files changed

+55
-38
lines changed

2 files changed

+55
-38
lines changed

packages/runtime-core/src/apiDefineComponent.ts

Lines changed: 53 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import type {
1212
EmitsOptions,
1313
EmitsToProps,
1414
ObjectEmitsOptions,
15+
ShortEmitsToObject,
1516
TypeEmitsToOptions,
1617
} from './componentEmits'
1718
import type {
@@ -169,18 +170,17 @@ type InferComponentOptions<
169170
> &
170171
TypeProps &
171172
EmitsToProps<
172-
// ResolvedEmits
173173
ExtractMixinEmits<Mixin> &
174174
ExtractMixinEmits<Extends> &
175-
(unknown extends TypeEmits
176-
? string[] extends RuntimeEmitsOptions
177-
? {}
178-
: RuntimeEmitsOptions extends (infer Keys extends
179-
string)[]
180-
? { [K in Keys]: (...args: any) => any }
181-
: RuntimeEmitsOptions
182-
: {}) &
183-
TypeEmitsToOptions<TypeEmits & {}>
175+
ResolveEmitsOptions<RuntimeEmitsOptions & {}, TypeEmits> &
176+
TypeEmitsToOptions<
177+
string[] extends RuntimeEmitsOptions
178+
? TypeEmits & {}
179+
: ResolveTypeEmits<
180+
RuntimeEmitsOptions & {},
181+
TypeEmits
182+
> & {}
183+
>
184184
>
185185
>,
186186
ExtractMixinSetupBindings<Mixin> &
@@ -195,17 +195,9 @@ type InferComponentOptions<
195195
ExtractMixinMethods<Mixin> &
196196
ExtractMixinMethods<Extends> &
197197
Methods & {},
198-
// ResolvedEmits
199198
ExtractMixinEmits<Mixin> &
200199
ExtractMixinEmits<Extends> &
201-
(unknown extends TypeEmits
202-
? string[] extends RuntimeEmitsOptions
203-
? {}
204-
: RuntimeEmitsOptions extends (infer Keys extends string)[]
205-
? { [K in Keys]: (...args: any) => any }
206-
: RuntimeEmitsOptions
207-
: {}) &
208-
TypeEmitsToOptions<TypeEmits & {}>,
200+
ResolveEmitsOptions<RuntimeEmitsOptions & {}, TypeEmits>,
209201
PublicProps,
210202
MakeDefaultsOptional extends boolean
211203
? Defaults
@@ -226,7 +218,8 @@ type InferComponentOptions<
226218
Slots & {},
227219
Exposed & string,
228220
TypeRefs & {},
229-
TypeEl & Element
221+
TypeEl & Element,
222+
ResolveTypeEmits<RuntimeEmitsOptions & {}, TypeEmits>
230223
>
231224
} & ConcreteComponentOptions
232225
: {})
@@ -255,6 +248,28 @@ export type DefineSetupFnComponent<
255248
S
256249
>
257250

251+
type ResolveEmitsOptions<
252+
RuntimeEmitsOptions extends EmitsOptions,
253+
TypeEmits extends ComponentTypeEmits | unknown,
254+
> = unknown extends TypeEmits
255+
? RuntimeEmitsOptions extends ObjectEmitsOptions
256+
? RuntimeEmitsOptions
257+
: {}
258+
: TypeEmits extends Record<string, any[]>
259+
? ShortEmitsToObject<TypeEmits>
260+
: {}
261+
262+
type ResolveTypeEmits<
263+
RuntimeEmitsOptions extends EmitsOptions,
264+
TypeEmits extends ComponentTypeEmits | unknown,
265+
> = TypeEmits extends (...args: any[]) => any
266+
? TypeEmits
267+
: TypeEmits extends Record<string, any[]>
268+
? {}
269+
: RuntimeEmitsOptions extends (infer Keys extends string)[]
270+
? (event: Keys, ...args: any[]) => void
271+
: {}
272+
258273
// defineComponent is a utility that is primarily used for type inference
259274
// when declaring components. Type inference is provided in the component
260275
// options (provided as the argument). The returned value has artificial types
@@ -322,19 +337,8 @@ export function defineComponent<
322337
// resolved types
323338
ResolvedEmits extends ObjectEmitsOptions = ExtractMixinEmits<Mixin> &
324339
ExtractMixinEmits<Extends> &
325-
(unknown extends TypeEmits
326-
? string[] extends RuntimeEmitsOptions
327-
? {}
328-
: RuntimeEmitsOptions extends (infer Keys extends string)[]
329-
? { [K in Keys]: (...args: any) => any }
330-
: RuntimeEmitsOptions
331-
: {}) &
332-
TypeEmitsToOptions<TypeEmits & {}>,
333-
ResolvedEmits_Internal extends EmitsOptions = unknown extends TypeEmits
334-
? string[] extends RuntimeEmitsOptions
335-
? string[]
336-
: ResolvedEmits
337-
: ResolvedEmits,
340+
ResolveEmitsOptions<RuntimeEmitsOptions, TypeEmits>,
341+
ResolvedTypeEmits = ResolveTypeEmits<RuntimeEmitsOptions, TypeEmits>,
338342
InferredProps = Readonly<
339343
ExtractPropTypes<
340344
ExtractMixinProps<Mixin> &
@@ -346,7 +350,14 @@ export function defineComponent<
346350
: {})
347351
> &
348352
TypeProps &
349-
EmitsToProps<ResolvedEmits>
353+
EmitsToProps<
354+
ResolvedEmits &
355+
TypeEmitsToOptions<
356+
string[] extends RuntimeEmitsOptions
357+
? TypeEmits & {}
358+
: ResolvedTypeEmits & {}
359+
>
360+
>
350361
>,
351362
InternalInstance = ComponentPublicInstance<
352363
InferredProps,
@@ -356,7 +367,7 @@ export function defineComponent<
356367
ExtractMixinData<Mixin> & ExtractMixinData<Extends> & EnsureNonVoid<Data>,
357368
ExtractMixinComputed<Mixin> & ExtractMixinComputed<Extends> & Computed,
358369
ExtractMixinMethods<Mixin> & ExtractMixinMethods<Extends> & Methods,
359-
ResolvedEmits_Internal,
370+
ResolvedEmits,
360371
{}, // PublicProps
361372
{}, // Defaults
362373
false,
@@ -365,7 +376,8 @@ export function defineComponent<
365376
Slots,
366377
Exposed,
367378
TypeRefs,
368-
TypeEl
379+
TypeEl,
380+
ResolvedTypeEmits
369381
>,
370382
>(
371383
options: {
@@ -390,7 +402,11 @@ export function defineComponent<
390402
setup?: (
391403
this: void,
392404
props: LooseRequired<InferredProps>,
393-
ctx: NoInfer<SetupContext<ResolvedEmits_Internal, Slots>>,
405+
ctx: NoInfer<
406+
SetupContext<ResolvedEmits, Slots> & {
407+
emit: ResolvedTypeEmits
408+
}
409+
>,
394410
) => Promise<SetupBindings> | SetupBindings | RenderFunction | void
395411
data?: (vm: NoInfer<InternalInstance>) => Data
396412
/**

packages/runtime-core/src/componentPublicInstance.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,7 @@ export type ComponentPublicInstance<
291291
Exposed extends string = '',
292292
TypeRefs extends Data = {},
293293
TypeEl extends Element = any,
294+
TypeEmits = {},
294295
> = {
295296
$: ComponentInternalInstance
296297
$data: D
@@ -303,7 +304,7 @@ export type ComponentPublicInstance<
303304
$root: ComponentPublicInstance | null
304305
$parent: ComponentPublicInstance | null
305306
$host: Element | null
306-
$emit: EmitFn<E>
307+
$emit: EmitFn<E> & TypeEmits
307308
$el: TypeEl
308309
$options: Options &
309310
MergedComponentOptionsOverride & {

0 commit comments

Comments
 (0)