5222c9f62cb7e221ec6e4525bf573021e528afc4900dda7b739d17ca130f00ea66980a940701c6cdad020871bda46f8320423bc92282b7e865c80b312cb9a5 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. import type { epPropKey } from './runtime';
  2. import type { ExtractPropTypes, PropType } from 'vue';
  3. import type { IfNever, UnknownToNever, WritableArray } from './util';
  4. type Value<T> = T[keyof T];
  5. /**
  6. * Extract the type of a single prop
  7. *
  8. * 提取单个 prop 的参数类型
  9. *
  10. * @example
  11. * ExtractPropType<{ type: StringConstructor }> => string | undefined
  12. * ExtractPropType<{ type: StringConstructor, required: true }> => string
  13. * ExtractPropType<{ type: BooleanConstructor }> => boolean
  14. */
  15. export type ExtractPropType<T extends object> = Value<ExtractPropTypes<{
  16. key: T;
  17. }>>;
  18. /**
  19. * Extracts types via `ExtractPropTypes`, accepting `PropType<T>`, `XXXConstructor`, `never`...
  20. *
  21. * 通过 `ExtractPropTypes` 提取类型,接受 `PropType<T>`、`XXXConstructor`、`never`...
  22. *
  23. * @example
  24. * ResolvePropType<BooleanConstructor> => boolean
  25. * ResolvePropType<PropType<T>> => T
  26. **/
  27. export type ResolvePropType<T> = IfNever<T, never, ExtractPropType<{
  28. type: WritableArray<T>;
  29. required: true;
  30. }>>;
  31. /**
  32. * Merge Type, Value, Validator types
  33. * 合并 Type、Value、Validator 的类型
  34. *
  35. * @example
  36. * EpPropMergeType<StringConstructor, '1', 1> => 1 | "1" // ignores StringConstructor
  37. * EpPropMergeType<StringConstructor, never, number> => string | number
  38. */
  39. export type EpPropMergeType<Type, Value, Validator> = IfNever<UnknownToNever<Value>, ResolvePropType<Type>, never> | UnknownToNever<Value> | UnknownToNever<Validator>;
  40. /**
  41. * Handling default values for input (constraints)
  42. *
  43. * 处理输入参数的默认值(约束)
  44. */
  45. export type EpPropInputDefault<Required extends boolean, Default> = Required extends true ? never : Default extends Record<string, unknown> | Array<any> ? () => Default : (() => Default) | Default;
  46. /**
  47. * Native prop types, e.g: `BooleanConstructor`, `StringConstructor`, `null`, `undefined`, etc.
  48. *
  49. * 原生 prop `类型,BooleanConstructor`、`StringConstructor`、`null`、`undefined` 等
  50. */
  51. export type NativePropType = ((...args: any) => any) | {
  52. new (...args: any): any;
  53. } | undefined | null;
  54. export type IfNativePropType<T, Y, N> = [T] extends [NativePropType] ? Y : N;
  55. /**
  56. * input prop `buildProp` or `buildProps` (constraints)
  57. *
  58. * prop 输入参数(约束)
  59. *
  60. * @example
  61. * EpPropInput<StringConstructor, 'a', never, never, true>
  62. * ⬇️
  63. * {
  64. type?: StringConstructor | undefined;
  65. required?: true | undefined;
  66. values?: readonly "a"[] | undefined;
  67. validator?: ((val: any) => boolean) | ((val: any) => val is never) | undefined;
  68. default?: undefined;
  69. }
  70. */
  71. export type EpPropInput<Type, Value, Validator, Default extends EpPropMergeType<Type, Value, Validator>, Required extends boolean> = {
  72. type?: Type;
  73. required?: Required;
  74. values?: readonly Value[];
  75. validator?: ((val: any) => val is Validator) | ((val: any) => boolean);
  76. default?: EpPropInputDefault<Required, Default>;
  77. };
  78. /**
  79. * output prop `buildProp` or `buildProps`.
  80. *
  81. * prop 输出参数。
  82. *
  83. * @example
  84. * EpProp<'a', 'b', true>
  85. * ⬇️
  86. * {
  87. readonly type: PropType<"a">;
  88. readonly required: true;
  89. readonly validator: ((val: unknown) => boolean) | undefined;
  90. readonly default: "b";
  91. __epPropKey: true;
  92. }
  93. */
  94. export type EpProp<Type, Default, Required> = {
  95. readonly type: PropType<Type>;
  96. readonly required: [Required] extends [true] ? true : false;
  97. readonly validator: ((val: unknown) => boolean) | undefined;
  98. [epPropKey]: true;
  99. } & IfNever<Default, unknown, {
  100. readonly default: Default;
  101. }>;
  102. /**
  103. * Determine if it is `EpProp`
  104. */
  105. export type IfEpProp<T, Y, N> = T extends {
  106. [epPropKey]: true;
  107. } ? Y : N;
  108. /**
  109. * Converting input to output.
  110. *
  111. * 将输入转换为输出
  112. */
  113. export type EpPropConvert<Input> = Input extends EpPropInput<infer Type, infer Value, infer Validator, any, infer Required> ? EpPropFinalized<Type, Value, Validator, Input['default'], Required> : never;
  114. /**
  115. * Finalized conversion output
  116. *
  117. * 最终转换 EpProp
  118. */
  119. export type EpPropFinalized<Type, Value, Validator, Default, Required> = EpProp<EpPropMergeType<Type, Value, Validator>, UnknownToNever<Default>, Required>;
  120. export {};