vuestic-ui
Version:
Vue 3 UI Framework
39 lines (38 loc) • 1.87 kB
TypeScript
import type { ComponentOptionsBase, PropType, VNodeProps } from 'vue';
export type ComponentProps<T> = T extends new () => {
$props: infer P;
} ? NonNullable<P> : T extends (...args: any[]) => {
__ctx?: {
props: infer P;
};
} ? NonNullable<P> : T extends (props: infer P, ...args: any) => any ? P : unknown;
export type ComponentSlots<T> = T extends new () => {
$slots: infer S;
} ? NonNullable<S> : T extends (props: any, ctx: {
slots: infer S;
attrs: any;
emit: any;
}, ...args: any) => any ? NonNullable<S> : {};
export type UnKeyofString<T> = T extends infer E & ThisType<void> ? E : never;
export type ExtractVolarEmitsType<T> = 'emits' extends keyof T ? UnKeyofString<(T['emits'] extends infer E | undefined ? E : never)> : never;
export type ExtractVolarEmitTypes<T> = ExtractVolarEmitsType<T> extends string[] ? ExtractVolarEmitsType<T> : Array<keyof Exclude<ExtractVolarEmitsType<T>, string[]>>;
export type ComponentEmit<T> = 'emits' extends keyof T ? ExtractVolarEmitTypes<T> : T extends {
emits: infer E;
} ? E : T extends new () => {
$emit: infer E;
} ? E : T extends (props: any, ctx: {
emit: infer E;
}, ...args: any) => any ? E : unknown;
export type DefineComponentOptions = ComponentOptionsBase<any, any, any, any, any, any, any, any>;
type MakeProps<T extends Record<string, any>> = {
[K in keyof T]-?: {
type: PropType<NonNullable<T[K]>>;
required: true;
default: T[K];
};
};
declare type ExtractDefineComponentPropsType<T> = MakeProps<Omit<ComponentProps<T>, 'class' | 'style' | keyof VNodeProps>>;
export type ExtractComponentProps<T> = true extends boolean ? ExtractDefineComponentPropsType<T> : never;
export type ExtractComponentEmits<T> = ComponentEmit<T>;
export type ExtractComponentPropTypes<T extends DefineComponentOptions> = ComponentProps<T>;
export {};