type InferEmitPayload = E extends Record any> ? A[0] : never export type EmitOf = T extends { __emitOptions?: infer E } ? InferEmitPayload : T extends new (...args: any) => { $emit: (event: K, ...args: infer A) => any } ? A[0] : never type ExtractProp = T extends { new(...args: any): { $props: infer P } } ? K extends keyof P ? P[K] : never : never; export type GlobalDialogPropsData = { body: T, footer?: Component, title?: string, description?: string, props?: ExtractProp onSuccess?: (data: EmitOf, close: () => any) => any, } const currentDialogData = shallowRef>(); const dialogOpen = ref(false); export function useDialog() { const open = (data: GlobalDialogPropsData) => { currentDialogData.value = data; dialogOpen.value = true; } const close = () => { dialogOpen.value = false; } return { open, close, isOpen: dialogOpen, data: currentDialogData } }