/** * 开发环境下的错误类型,如参数不匹配等 */ declare class DevNetError extends Error { readonly isDev = true; constructor(message: string); } /** * 检测是不是开发环境下的错误类型 */ declare function isDevNetError(err: any): err is DevNetError; /** * 请求配置 * 所有字段都会传入用户设置的 requestHandler 中 */ type Config = { body: Body; query: Query; method: string; url: string; headers: any; [key: string]: any; }; type RequestHandler = (config: Config) => Promise; /** * 请求桥接器 * 请求过程会通过桥接器来和用户代码进行桥接 */ declare class BridgeImpl { #private; /** * 设置请求处理器 */ setRequestHandler: (handler: RequestHandler) => void; /** * 发起请求, 调用用户设置的请求器 */ request: (config: any) => T; } /** * 获取唯一的http请求实例 */ declare function useBridge(): BridgeImpl; /** * 定义接口,返回一个可带详细类型的请求函数 * * @example * const getUser = api<(id: string) => any>`GET /user/{id}` * * getUser(10) * .then(res => console.log(res)) */ declare function api any>(apiConfig: TemplateStringsArray): { (...arg: Parameters): Promise>; readonly raw: string; }; type Fn = (...args: any[]) => any; /** * 获取 api 的所有类型 * 因为生成代码的 bean 名字是不确定且是不固定的,但是api名字是固定的。所以需要使用这个类型工具来获取返回值类型 * * @example * const getUser = api<(config?: { query: boolean, body: string }) => Promise>`get /user` * type GetUserApi = Api * type GetUserQuery = GetUserApi['query'] // boolean * type GetUserBody = GetUserApi['body'] // string * type GetUserResult = GetUserApi['result'] // number */ type Api = { query: Query; body: Body; result: Ret; }; /** * 获取api返回值类型, 如果返回类型是 promise, 会自动进行解包 * @example * const getUser = api<(config?: { query: boolean, body: string }) => Promise>`get /user` * type GetUserResult = Ret // number */ type Ret> = R extends Promise ? V : R; /** * 获取api参数类型 * @example * const getUser = api<(config?: { query: boolean, body: string }) => Promise>`get /user` * type GetUserQuery = Query // boolean */ type Query> = L extends { query: infer V; } ? V : never; /** * 获取api body 类型 * @example * const getUser = api<(config?: { query: boolean, body: string }) => Promise>`get /user` * type GetUserBody = Body // string */ type Body> = L extends { body: infer V; } ? V : never; /** * 获取函数最后一个参数类型 */ type LastArg = Last>; type Tail = ((...t: T) => void) extends (h: any, ...r: infer R) => void ? R : never; type Last = T[Exclude>]; export { Api, Body, Config, DevNetError, Query, RequestHandler, Ret, api, isDevNetError, useBridge };