api.d.ts 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. // 获取函数的返回类型
  2. type GetArgType<T> = T extends (arg: infer AT) => any ? AT : never
  3. // 获取函数的返回类型
  4. type GetReturnType<T> = T extends (...args: any[]) => infer RT ? RT : never
  5. type IFCommon = {
  6. /** 是上传文件接口 */ isUpload?: boolean
  7. }
  8. // 接口信息
  9. interface IFConfig extends IFCommon {
  10. realUrl: string
  11. /**
  12. * 接口请求参数类型
  13. */
  14. reqType?: QT
  15. /**
  16. * 接口请求参数类型
  17. */
  18. resType?: ST
  19. }
  20. /**
  21. * 返回安全类型
  22. * NT 新类型
  23. * OT 旧类型
  24. * 权重:新类型>旧类型,权重高的有值则使用
  25. */
  26. // (OT extends never ? any : OT)
  27. // type GetSAST<NT, OT> = unknown extends NT ? OT : NT
  28. // /** 合并两个类型,新类型覆盖旧类型 */
  29. // type MergeType<NT, OT> = NT extends AnyObject ? MergeObjectType<NT, OT> : NT
  30. // /** 合并两个对象类型,新类型覆盖旧类型的子属性 */
  31. // type MergeObjectType<NT, OT> = {
  32. // [P in keyof (OT & NT)]: P extends keyof NT ? MergeType<NT[P], OT[P]> : OT[P]
  33. // }
  34. /** 两个类型完全相等 */
  35. type IsEqual<X, Y> =
  36. (<T>() => T extends X ? 1 : 2) extends <T>() => T extends Y ? 1 : 2 ? true : false
  37. // X extends Y ? (Y extends X ? true : false) : false
  38. /** 合并子属性 */
  39. type MargeSub<OT, NT> = {
  40. [P in keyof NT]: SafeMarge<OT[P], NT[P]>
  41. }
  42. /** 安全合并:
  43. * NT为any类型使用OT,
  44. * NT为对象进行合并,删除(OT)旧类型的((NT)新类型的属性)属性 & (NT)新类型,
  45. * NT为一般类型使用NT */
  46. type SafeMarge<OT, NT> =
  47. IsEqual<NT, any> extends true
  48. ? OT
  49. : NT extends AnyObject
  50. ? Omit<OT, keyof NT> & MargeSub<OT, NT>
  51. : NT
  52. /** 未设置NT使用OT */
  53. type SwitchType<OT, NT> = NT extends null ? OT : SafeMarge<OT, Omit<NT, ''>> // Omit<NT, ''> 是重点!!! 可以巧妙的避免其作为入参类型时的自动推导
  54. /** 请求方法 */
  55. type RequestFunc<QT, ST> = <Q = null, S = null>(
  56. args?: SwitchType<QT, Q>,
  57. options?: IRequestExt,
  58. ) => PromiseExt<SwitchType<ST, S>>
  59. /**
  60. * 接口的服务类型
  61. * @generic ST:接口配置的resType类型,接口返回值类型
  62. * @generic QT:接口配置的reqType类型,接口请求参数类型
  63. */
  64. interface IServiceApi<QT, ST> {
  65. /**
  66. * get 请求
  67. * @generic Q:对入参类型的修饰,传null不进行修饰
  68. * @generic S:对出参类型的修饰,传null不进行修饰
  69. */
  70. get: RequestFunc<QT, ST>
  71. /**
  72. * post 请求
  73. * @generic Q:对入参类型的修饰,传null不进行修饰
  74. * @generic S:对出参类型的修饰,传null不进行修饰
  75. */
  76. post: RequestFunc<QT, ST>
  77. // post: <S = ST, Q = QT>(args?: Q, options?: IRequestOption) => PromiseExt<S>
  78. }
  79. /** 扩展Promise定义 */
  80. interface PromiseExt<T> {
  81. then(onfulfilled?: (value: T) => void | undefined | null): PromiseExt<T>
  82. catch(onrejected?: ((reason: TPromiseCatchReason) => void) | undefined | null): PromiseExt<T>
  83. }
  84. /** catch回调函数入参 */
  85. interface TPromiseCatchReason {
  86. /** 错误类型 enums.ErrorType */
  87. errType: number
  88. /** 公共请求入参 */
  89. options: IRequestOption
  90. /** 业务异常信息 */
  91. res?: IResData<any>
  92. /** 通讯异常信息 */
  93. errInfo?: UniApp.RequestSuccessCallbackResult
  94. }
  95. /** 接口信息 */
  96. type IWebApi = {
  97. /**
  98. * 接口名称
  99. */
  100. name: string
  101. /**
  102. * 动态获取接口当前地址
  103. * @returns
  104. */
  105. getUrl: () => string
  106. /**
  107. * 当前接口分组
  108. */
  109. group: string
  110. } & IFCommon
  111. /** 公共请求入参 */
  112. type IRequestOption = {
  113. /** 接口信息 */
  114. urlObj?: IWebApi
  115. /** UniApp请求入参合集 */
  116. uur: UUR
  117. /** 扩展参数 */
  118. ext: IRequestExt
  119. }
  120. /** UniApp请求入参合集 */
  121. interface UUR extends UniApp.RequestOptions, UniApp.UploadFileOption {
  122. url?: string
  123. }
  124. /** 请求的扩展参数 */
  125. interface IRequestExt {
  126. /** 显示loading效果 */
  127. showLoading?: boolean
  128. /** loading文案 */
  129. loadingText?: string
  130. /** 上传文件选择的文件列表 */
  131. choosFiles?: string[]
  132. /** 最多可以选择的文件个数,默认1 */
  133. fileCount?: number
  134. /** 追加url */
  135. appendUrl?: string
  136. /** 最小请求时长 ms */
  137. minRTime?: number
  138. /** 临时记录请求时间戳 ms */
  139. _tempRtimespan?: number
  140. }
  141. /** 分页返回数据 */
  142. type IPage<T> = {
  143. /** 当前页 */
  144. current?: number
  145. /** 总页数 */
  146. pages?: number
  147. /** 总条数 */
  148. total?: number
  149. /** 数据集合 */
  150. records?: Array<T>
  151. }
  152. /** 分页请求参数 */
  153. interface IPageParams<T> {
  154. /** 当前页面 */
  155. page: number
  156. /** 数据量 */
  157. size: number
  158. /** 请求的参数 */
  159. param: T
  160. }
  161. /** 接口统一返回结构 */
  162. type IResData<T> = {
  163. code: number
  164. message: string
  165. data: T
  166. }