import { VNode } from './vnode' import { Data, UnionToIntersection } from './common' import { Vue } from './vue' export type Slot = (...args: any[]) => VNode[] export type Slots = Record export type ObjectEmitsOptions = Record< string, ((...args: any[]) => any) | null > export type EmitsOptions = ObjectEmitsOptions | string[] export type EmitFn< Options = ObjectEmitsOptions, Event extends keyof Options = keyof Options, ReturnType extends void | Vue = void > = Options extends Array ? (event: V, ...args: any[]) => ReturnType : {} extends Options // if the emit is empty object (usually the default value for emit) should be converted to function ? (event: string, ...args: any[]) => ReturnType : UnionToIntersection< { [key in Event]: Options[key] extends (...args: infer Args) => any ? (event: key, ...args: Args) => ReturnType : (event: key, ...args: any[]) => ReturnType }[Event] > export type ComponentRenderEmitFn< Options = ObjectEmitsOptions, Event extends keyof Options = keyof Options, T extends Vue | void = void > = EmitFn export interface SetupContext { attrs: Data slots: Slots emit: EmitFn }