Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

建议wxp里request返回类型增加泛型 #37

Open
AlexStacker opened this issue Mar 28, 2018 · 8 comments
Open

建议wxp里request返回类型增加泛型 #37

AlexStacker opened this issue Mar 28, 2018 · 8 comments
Labels
enhancement New feature or request

Comments

@AlexStacker
Copy link

AlexStacker commented Mar 28, 2018

 namespace request {
    type Promised<T> = {
      /**
       * 开发者服务器返回的数据
       */
      data: T
      /**
       * 开发者服务器返回的 HTTP 状态码
       */
      statusCode: number
      /**
       * 开发者服务器返回的 HTTP Response Header
       *
       * @since 1.2.0
       */
      header: any
    }
}

对应的request接口调整

function request<T = any>(OBJECT: request.Param): Promise<request.Promised<T>>

这样在使用的时候就可以指定返回类型了

interface IList {
    code: number;
    list: <{}>[];
}
export async function GetList(name?: string, page?: number) {
  let result =  await wxp.request<IList>({
    url: urlList,
    data: {
      page,
      name
    }
  });

  result.data.code // 自动提示
}
@qiu8310
Copy link
Owner

qiu8310 commented Mar 28, 2018

嗯,建议不错! 谢谢

@qiu8310 qiu8310 added the enhancement New feature or request label Mar 28, 2018
@AlexStacker
Copy link
Author

球大响应速度真快,用定minapp了。

@qiu8310
Copy link
Owner

qiu8310 commented Mar 28, 2018

不过你这个我不确定什么时候会实现,主要需要改动生成器,如果直接修改 wxp.d.ts 就快了。

最近打算出一套 ui,所以我尽量早点实现吧。

@AlexStacker
Copy link
Author

我也研究了下生成器,确实很复杂,水平有限没搞懂怎么改,所以还是请大佬来改。
我现在直接改的wxp.d.ts,估计后面也应该差不离,先用着。

@qiu8310
Copy link
Owner

qiu8310 commented Mar 30, 2018

@AlexStacker 我看了下你的 PR,有些建议,看看是否会对你理解有帮助:

  1. 首先 Func 需要是 promisable 的,这样 Func 中的第一个参数一定是个 ObjectType
  2. 可以调用 ObjectType.getSuccessFirstArgType 来获取 success 函数的第一个参数的 Type
  3. 如果这个 Type 也是个 ObjectType 的话,就需要读取它下面的每个字段,判断有没有含 any 类型的(有时 Type 可以是多个类型,如 any | ArrayBuffer,其实可以把它也当作 any 处理)
  4. 然后对含 any 的类型用 T1, T2, T3 替换(需要考虑多个泛型的情况)
  5. 最后处理那单行的函数定义

这是我大概的一个思路,我还没具体做,有可能还需要完善。最近比较忙,没太多自由时间,所以匆忙写了些思路。另外我写了一个文档,方便你自己调试,你有兴趣的话可以试试
https://github.com/qiu8310/minapp/tree/develop/packages/minapp-generator

关于你的 PR

  • function request<T = any> 这里的 T 在你的 PR 中好像不是 any

  • 另外好像没有处理返回值中 (OBJECT: request.Param): Promise<request.Promised<T>> 的泛型吧

@AlexStacker
Copy link
Author

现在的结果是这样的:
image
image
之前理解的不是很透彻,只看了helper函数和Func部分,搞的不是太懂。这个PR只是简单的把success返回结果中含data字段的给增加一个泛型,最终结果只改了request、getStorage、getClipboardData、canvasGetImageData这几个函数,没考虑其他的情况。

不过如果对any类型的都增加一个泛型的话我觉得可能更好一些,即使微信文档没有类型的地方也都可以手动指定类型。这个大佬实现的速度比我慢慢看然后实现的应该快,我也再看看可能实现的了。

@AlexStacker
Copy link
Author

刚刚看了贡献文档,突然发现自己好傻,在代码里加一个判断语句判断prefix是否到了request再进入debug,哈哈,好low

@qiu8310
Copy link
Owner

qiu8310 commented Mar 30, 2018

其实我代码写的比较乱 😂 你还能去试已经很不错了 👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

2 participants