/* eslint-disable ts/no-explicit-any */ /** 泛型组件工具 */ import type { AllowedComponentProps, ComponentCustomProps, ShallowUnwrapRef, VNode, VNodeProps } from 'vue' /** * 简单类型工具 */ /** 并集转交集 */ export type Union2Intersection = (Union extends any ? (argument: Union) => void : never) extends ( argument: infer I, ) => void ? I : never type Union2UoF = Union extends any ? (argument: Union) => void : never type Union2IoF = Union2Intersection> type Firs2fUnion = Union2IoF extends { (argument: infer T): void } ? T : never type Union2TupleRecurser = [ Firs2fUnion, Exclude>, ] extends [infer First, ...infer Lasts] ? ([First] extends [never] ? Tuple : Union2TupleRecurser) : never /** 并集转元组 */ export type Union2Tuple = Union2TupleRecurser /** vue 组件助手 */ export type PublicProps = VNodeProps & AllowedComponentProps & ComponentCustomProps export type GenericExposed = ShallowUnwrapRef export type GenericCtx = { props: P & PublicProps emit: E attrs: A slots: S expose(exposed: GenericExposed): void } export type GenericReturn = VNode & { __ctx?: GenericCtx } /** 或许是 Promise */ export type MaybePromise = T | Promise /** 可等待的 */ export type Awaitable = T | PromiseLike /** 或许是 Array */ export type MaybeArray = T | Array /** 或许是 ArrayLike */ export type MaybeArrayLike = T | ArrayLike /** 或许是 Iterable */ export type MaybeIterable = T | Iterable /** 将不可变转换为可变 */ export type Mutable = { -readonly [P in keyof T]: T[P] } /** 部分键设为必须 */ export type RequiredKeys = T & { [P in K]-?: NonNullable } /** 部分键设为可选 */ export type PartialKeys = Omit & { [P in K]?: T[P] } /** 映射键名称 */ export type MapObjectProps = P extends 'front' ? { [Key in (keyof T) & string as `${K}${Capitalize}`]: T[Key] } : { [Key in (keyof T) & string as `${Key}${Capitalize}`]: T[Key] } /** 提取数组项类型 */ export type ItemTypeOf = T extends Array<(infer R)> ? R : never /** 假值类型 */ export type Falsely = false | null | undefined | '' | 0