// copy from element-plus import type { CSSProperties, Plugin } from 'vue'; type OptionalKeys> = { [K in keyof T]: T extends Record ? never : K; }[keyof T]; type RequiredKeys> = Exclude>; type MonoArgEmitter = (evt: K, arg?: T[K]) => void; type BiArgEmitter = (evt: K, arg: T[K]) => void; export type EventEmitter> = MonoArgEmitter> & BiArgEmitter>; export type AnyFunction = (...args: any[]) => T; export type PartialReturnType unknown> = Partial>; export type SFCWithInstall = T & Plugin; export type Nullable = T | null; export type RefElement = Nullable; export type CustomizedHTMLElement = HTMLElement & T; export type Indexable = { [key: string]: T; }; export type Hash = Indexable; export type TimeoutHandle = ReturnType; export type ComponentSize = 'large' | 'medium' | 'small' | 'mini'; export type StyleValue = string | CSSProperties | Array; export type Mutable = { -readonly [P in keyof T]: T[P] }; export type Merge = { [K in keyof O | keyof T]: K extends keyof T ? T[K] : K extends keyof O ? O[K] : never; }; /** * T = [ * { name: string; age: number; }, * { sex: 'male' | 'female'; age: string } * ] * => * MergeAll = { * name: string; * sex: 'male' | 'female'; * age: string * } */ export type MergeAll = T extends [ infer F extends object, ...infer Rest extends object[], ] ? MergeAll> : R;