import type { ComputedRef, MaybeRef } from 'vue'; /** * 深层递归所有属性为可选 */ type DeepPartial = T extends object ? { [P in keyof T]?: DeepPartial; } : T; /** * 深层递归所有属性为只读 */ type DeepReadonly = { readonly [P in keyof T]: T[P] extends object ? DeepReadonly : T[P]; }; /** * 任意类型的异步函数 */ type AnyPromiseFunction = ( ...arg: T ) => PromiseLike; /** * 任意类型的普通函数 */ type AnyNormalFunction = (...arg: T) => R; /** * 任意类型的函数 */ type AnyFunction = | AnyNormalFunction | AnyPromiseFunction; /** * T | null 包装 */ type Nullable = null | T; /** * T | Not null 包装 */ type NonNullable = T extends null | undefined ? never : T; /** * 字符串类型对象 */ type Recordable = Record; /** * 字符串类型对象(只读) */ interface ReadonlyRecordable { readonly [key: string]: T; } /** * setTimeout 返回值类型 */ type TimeoutHandle = ReturnType; /** * setInterval 返回值类型 */ type IntervalHandle = ReturnType; /** * 也许它是一个计算的 ref,或者一个 getter 函数 * */ type MaybeReadonlyRef = (() => T) | ComputedRef; /** * 也许它是一个 ref,或者一个普通值,或者一个 getter 函数 * */ type MaybeComputedRef = MaybeReadonlyRef | MaybeRef; 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 * } */ type MergeAll< T extends object[], R extends object = Record, > = T extends [infer F extends object, ...infer Rest extends object[]] ? MergeAll> : R; type EmitType = (name: Name, ...args: any[]) => void; type MaybePromise = Promise | T; export type { AnyFunction, AnyNormalFunction, AnyPromiseFunction, DeepPartial, DeepReadonly, EmitType, IntervalHandle, MaybeComputedRef, MaybePromise, MaybeReadonlyRef, Merge, MergeAll, NonNullable, Nullable, ReadonlyRecordable, Recordable, TimeoutHandle, };