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

uni.d.ts不能正确推断类型 #1770

Closed
keyiis opened this issue Jun 7, 2020 · 14 comments
Closed

uni.d.ts不能正确推断类型 #1770

keyiis opened this issue Jun 7, 2020 · 14 comments

Comments

@keyiis
Copy link

keyiis commented Jun 7, 2020

问题描述
今天想尝试下uniapp,碰到如下问题:
1、使用下面的vue命令行创建项目,等了15分钟才创建成功
vue create -p dcloudio/uni-preset-vue test
不知道有没有优化的办法,我的网络确定是没问题的。
2、uni.d.ts没有关于uni.request返回promise的定义,只有回调的方式。
3、uni.d.ts里uni.request返回数据的data属性定义有问题,建议使用any,否则vscode会提示类型错误。

系统信息:

  • 发行平台: 微信小程序
  • 操作系统 win10
    vscode
  • HBuilderX版本 [如使用HBuilderX,则需提供 HBuilderX 版本号]
  • uni-app版本 [如使用Vue-cli创建/运行项目,则提供npm run info的运行结果]
PS D:\uniapp> npm run info

> [email protected] info D:\project\yly\uniapp
> node node_modules/@dcloudio/vue-cli-plugin-uni/commands/info.js

uni-app v2.7.9
uni-app cli v2.0.0-27920200527001

@zhetengbiji
Copy link
Collaborator

  1. 可以尝试把 npm 源修改为淘宝源
  2. 目前返回的格式和常用的不同(详见),考虑后期改动,d.ts 中暂未定义
  3. uni.request 返回的 data 可能的类型有三种,当 ts 无法自动推导类型时,可以使用类型断言

@keyiis
Copy link
Author

keyiis commented Jun 8, 2020

@zhetengbiji
1、npm源已经修改过

npm config get registry
https://registry.npm.taobao.org/

2、目前这种返回参数是有点奇怪,建议错误在catch里抛出
3、目前的定义方式肯定无法自动推断,如果要显式断言,那d.ts里定义就失去意义了,data返回数据通常情况下都是难以确定类型的,因此建议直接改成any

@SiiZhao
Copy link

SiiZhao commented Jun 8, 2020

这个request返回的类型是上次我给官方提议修改的,你不能为了自己偷懒就要求改成any

目前这个uni.d.ts里还有一些地方用的any,抽空我要找出来让官方一一改掉。滥用any不是好习惯。

@keyiis
Copy link
Author

keyiis commented Jun 19, 2020

@SiiZhao 原来是你提议的,那请教你两个问题?
1、如何让vscode不提示类型错误?
2、如果返回的data是我自定义的数据结构,目前的这种定义方式即不能帮我正确推断类型还会带来错误提示,价值何在?
官方可以参考koa的ctx.body,想一想它为什么没有定义具体的类型?
希望出品方保持清醒的判断!

@SiiZhao
Copy link

SiiZhao commented Jun 19, 2020

@SiiZhao 原来是你提议的,那请教你两个问题?
1、如何让vscode不提示类型错误?
2、如果返回的data是我自定义的数据结构,目前的这种定义方式即不能帮我正确推断类型还会带来错误提示,价值何在?
官方可以参考koa的ctx.body,想一想它为什么没有定义具体的类型?
希望出品方保持清醒的判断!

自己写上就好了,之前我提议的是string | object | ArrayBuffer,不过我看后来官方实现的是string | AnyObject | ArrayBuffer

uni.request({
  url,
  success(res) {
    const data = res.data;
    console.log((<AnyObject>data).abc);
  }
});

@keyiis
Copy link
Author

keyiis commented Jun 19, 2020

@SiiZhao 目前的定义有点画蛇添足,建议改成any。实际应用中返回数据都要和具体业务结合,比如返回一个订单对象,那就不是
console.log((<AnyObject>data).abc);
而可能是
console.log((<IOrder>data).code);
这个决定权应该交给使用者

@SiiZhao
Copy link

SiiZhao commented Jun 19, 2020

@SiiZhao 目前的定义有点画蛇添足,建议改成any。实际应用中返回数据都要和具体业务结合,比如返回一个订单对象,那就不是
console.log((<AnyObject>data).abc);
而可能是
console.log((<IOrder>data).code);
这个决定权应该交给使用者

没毛病啊

interface IOrder {
  code: number
}
uni.request({
  url,
  success(res) {
    const data = res.data;
    console.log((<IOrder>data).code);
  }
});

@ghost
Copy link

ghost commented Jun 19, 2020

虽然我不赞成any,但是应该可以改的更智能。微信官方的typings也有类似提议,希望官方能参考一下: Should wx.request have a type parameter?

@keyiis
Copy link
Author

keyiis commented Jun 19, 2020

@chejj 这种方式其实和消费data时再定义类型区别不大,data应该是什么类型是数据消费者定义的,场景千变万化,uniapp根本不可能预测,目前ts里只有any能覆盖所有可能,这也是为什么大部分框架都不会对接口返回数据去做约束。

@adams549659584
Copy link

image
我这遇到了,暂时这样适配下就好,基本全类型支持

@adams549659584
Copy link

似乎Uni官方的Promise响应不大一样,还得改改就好

@adams549659584
Copy link

image

@StrivingRabbit
Copy link
Collaborator

StrivingRabbit commented Feb 13, 2023

关于api 的 Promise 化类型提示。除 uni.request 有返回值同步的方法(即以 sync 结束)以 create 开头的方法以 manager 结束的方法返回 task 的 api 暂不处理外,其他可以升级 @dcloudio/[email protected] 试试看

@StrivingRabbit
Copy link
Collaborator

部分 api promise 化提示已支持,后续进度请跟踪 #3009 查看

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

No branches or pull requests

5 participants