// 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 AnyPromiseFunction = (...arg: any[]) => PromiseLike /** * 任意类型的普通函数 */ export type AnyNormalFunction = (...arg: any[]) => any /** * 任意类型的函数 */ export type AnyFunction = AnyNormalFunction | AnyPromiseFunction export type PartialReturnType unknown> = Partial> export type SFCWithInstall = T & Plugin export type Nullable = T | null /** * 字符串类型对象 */ export type Recordable = Record export type RefElement = Nullable export type CustomizedHTMLElement = HTMLElement & T export interface 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] } 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