import type { epPropKey } from './runtime'; import type { ExtractPropTypes, PropType } from 'vue'; import type { IfNever, UnknownToNever, WritableArray } from './util'; type Value = T[keyof T]; /** * Extract the type of a single prop * * 提取单个 prop 的参数类型 * * @example * ExtractPropType<{ type: StringConstructor }> => string | undefined * ExtractPropType<{ type: StringConstructor, required: true }> => string * ExtractPropType<{ type: BooleanConstructor }> => boolean */ export type ExtractPropType = Value>; /** * Extracts types via `ExtractPropTypes`, accepting `PropType`, `XXXConstructor`, `never`... * * 通过 `ExtractPropTypes` 提取类型,接受 `PropType`、`XXXConstructor`、`never`... * * @example * ResolvePropType => boolean * ResolvePropType> => T **/ export type ResolvePropType = IfNever; required: true; }>>; /** * Merge Type, Value, Validator types * 合并 Type、Value、Validator 的类型 * * @example * EpPropMergeType => 1 | "1" // ignores StringConstructor * EpPropMergeType => string | number */ export type EpPropMergeType = IfNever, ResolvePropType, never> | UnknownToNever | UnknownToNever; /** * Handling default values for input (constraints) * * 处理输入参数的默认值(约束) */ export type EpPropInputDefault = Required extends true ? never : Default extends Record | Array ? () => Default : (() => Default) | Default; /** * Native prop types, e.g: `BooleanConstructor`, `StringConstructor`, `null`, `undefined`, etc. * * 原生 prop `类型,BooleanConstructor`、`StringConstructor`、`null`、`undefined` 等 */ export type NativePropType = ((...args: any) => any) | { new (...args: any): any; } | undefined | null; export type IfNativePropType = [T] extends [NativePropType] ? Y : N; /** * input prop `buildProp` or `buildProps` (constraints) * * prop 输入参数(约束) * * @example * EpPropInput * ⬇️ * { type?: StringConstructor | undefined; required?: true | undefined; values?: readonly "a"[] | undefined; validator?: ((val: any) => boolean) | ((val: any) => val is never) | undefined; default?: undefined; } */ export type EpPropInput, Required extends boolean> = { type?: Type; required?: Required; values?: readonly Value[]; validator?: ((val: any) => val is Validator) | ((val: any) => boolean); default?: EpPropInputDefault; }; /** * output prop `buildProp` or `buildProps`. * * prop 输出参数。 * * @example * EpProp<'a', 'b', true> * ⬇️ * { readonly type: PropType<"a">; readonly required: true; readonly validator: ((val: unknown) => boolean) | undefined; readonly default: "b"; __epPropKey: true; } */ export type EpProp = { readonly type: PropType; readonly required: [Required] extends [true] ? true : false; readonly validator: ((val: unknown) => boolean) | undefined; [epPropKey]: true; } & IfNever; /** * Determine if it is `EpProp` */ export type IfEpProp = T extends { [epPropKey]: true; } ? Y : N; /** * Converting input to output. * * 将输入转换为输出 */ export type EpPropConvert = Input extends EpPropInput ? EpPropFinalized : never; /** * Finalized conversion output * * 最终转换 EpProp */ export type EpPropFinalized = EpProp, UnknownToNever, Required>; export {};