thx / rapper

一个自带类型的请求库

Home Page:https://www.yuque.com/rap/rapper/readme

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

建议生成的 fetch 对象中, 使用泛型来约束类型, 而不是属性

acrazing opened this issue · comments

目前生成的代码大概是这样:

export interface IModels {
  'GET/welcome': {
    Req: {},
    Res: {},
  }
}

export const createFetch() {
  return {
    'GET/welcome': (input) => doFetch('GET', '/welcome', input),
    // ...
  }
}

export const fetch = createFetch()

这样会生成大量的没有意义的 api 实例函数(createFetch 函数内返回的对象在编译成 js 后依旧存在), 建议改成这样:

export interface IModels {
  'GET/welcome': {
    Req: {},
    Res: {},
  }
}

export function fetch<K extends keyof IModels>(key: K, input: IModels[K]['Req']): Promise<IModels[K]['Res']> {
  const pos = key.indexOf('/')
  const method = key.substr(0, pos)
  const url = key.substr(pos)

  return doFetch(method, url, input)
}

这样生成的 js 代码就只有一个 fetch 实例了, 会简单很多, 并且 IDE 在提示的时候, 对函数参数的支持会比 ['GET/welcome'] 这种形式更友好.

你的方案的确可以避免生成大量的没有意义的 api 实例函数

但没法解决的一个痛点是在 IDE 里直接 link 跳转到对应的接口,如果采用 ['GET/welcome'] 这种方式 就可以快速方便的找到 rap 地址,这一点在开发中非常重要(我们会经常去rap2平台看、改接口定义)

image

计划在 2.0 版本采用你的方案

但是我们要先评估下升级的风险,目前我们内部大量的项目都在使用这个方案,毕竟这个改动属于比较大的 breaking change,使用方式都要发生大的变化