dcloudio / uni-app

A cross-platform framework using Vue.js
https://uniapp.dcloud.io
Apache License 2.0
39.9k stars 3.62k forks source link

求求你们加强对TS的支持吧 #3009

Closed Iongtao closed 1 year ago

Iongtao commented 2 years ago

新功能描述 很多api的ts支持真的好差啊 虽然说vue3比vue2时候好了一些吧 但还是好差

现状及问题 image 文档注释是这样的 image request请求也不支持promise

尝试方案 官网上都写了对promise的支持 结果ts不支持 真的对我们写ts的人来说好心累

补充信息 [其它你认为有参考价值的信息]

Iongtao commented 2 years ago

隔壁taro对ts支持就好太多了 去偷点Types过来呀

WindrunnerMax commented 2 years ago

还有uni很多Api调用支持Promise写法,但是d.ts没声明,只能写回调。。。

JesseChain commented 2 years ago

唉,vue和uni-app对ts支持太糟糕了,到了vue3也还是有痛点

hairyf commented 2 years ago

😕 可是 request 返回的就是 task 阿

sonofmagic commented 1 year ago

2023年了,现在版本的 uni-app 还是没有对 types 里,原先的回调函数进行重载,返回 promise 类型,依旧还是一个大大的 void

导致:

const [err, res] = await uni.showModal

这种全部报错

StrivingRabbit commented 1 year ago

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

sonofmagic commented 1 year ago
uni.showModal

我升级到了 @dcloudio/types@3.3.0 有个问题哈,现在 API Promise 化,调用结果在 vue2 和 vue3 是不同的

在 Vue3 中,处理 API Promise 化 调用结果的方式不同于 Vue2。更多

Vue3 中,调用成功会进入 then 方法,调用失败会进入 catch 方法 Vue2 中,调用无论成功还是失败,都会进入 then 方法,返回数据的第一个参数是错误对象,第二个参数是返回数据

详见 https://uniapp.dcloud.net.cn/tutorial/migration-to-vue3.html#api-promise-%E5%8C%96-%E8%B0%83%E7%94%A8%E7%BB%93%E6%9E%9C%E7%9A%84%E6%96%B9%E5%BC%8F

@dcloudio/types@3.3.0 这个版本在 vue3 项目下是好的,vue2就不行:

vue2 项目:

image

vue3 项目:

image

是不是应该给这个包打个 tag 来区别 vue2 还是 vue3 的 dts ?

@dcloudio/uvm

另外其实我每次通过 npx @dcloudio/uvm [alpha] 升级包的时候

总是会降低 @dcloudio/types 的版本,而且还会装一个 flyio ,这个弄得很烦

另外我经常出来让我安装新版本 npx @dcloudio/uvm 的提示,结果执行之后,发现没有那个版本执行失败

是不是发布之后,包没有同步到 npmmirror 上呀?

StrivingRabbit commented 1 year ago

@sonofmagic 关于 vue2 可以参考文档 处理,后续也会发布 vue2 的 api promise 处理

ModyQyW commented 1 year ago

希望官方对社区关注多一些,跟进社区诉求快一些。

附带目前自己的解决方案 @uni-helper/uni-promises@uni-helper/uni-use,希望有所帮助。

StrivingRabbit commented 1 year ago

@dcloudio/types@3.3.1 已发布: 支持 connectSocket、request、uploadFile、downloadFile API 的 Promise 化 ts 提示

关于 vue2 可以参考文档 处理,后续也会发布 vue2 的 api promise 处理

BigFatStar commented 1 year ago

@dcloudio/types@3.3.1 已发布: 支持 connectSocket、request、uploadFile、downloadFile API 的 Promise 化 ts 提示

关于 vue2 可以参考文档 处理,后续也会发布 vue2 的 api promise 处理

使用ts定义request的返回值类型还是会有不准确的问题啊

zhetengbiji commented 1 year ago

@dcloudio/types@3.3.1 已发布: 支持 connectSocket、request、uploadFile、downloadFile API 的 Promise 化 ts 提示

关于 vue2 可以参考文档 处理,后续也会发布 vue2 的 api promise 处理

使用ts定义request的返回值类型还是会有不准确的问题啊

具体讲一下

luokang2015 commented 1 year ago

@dcloudio/types@3.3.1 已发布: 支持 API 的 Promise 化 ts 提示connectSocket、request、uploadFile、downloadFile

关于 vue2 可以参考文档 处理,后续也会发布 vue2 的 API promise 处理

使用ts定义request的返回值类型还是会有不准确的问题啊

具体讲一下

await uni.request({ url: 'https://fc-mp-8ba27ec2-89fd-48c2-ba92-9c9aca.next.bspapp.com/api/user/getU' }) 请求云对象url化,ts推断返回的是RequestTask类型,不能使用await,虽然这个api不使用success就promise化了,所以我不得不使用await new Promise((resolve)=>{ uni.request({ success: (res)=>{ reslove(res.data as Type) //我的ts实在是太烂了,没有更好的处理方案 } }) })

StrivingRabbit commented 1 year ago

@dcloudio/types@3.3.1 已发布: 支持 API 的 Promise 化 ts 提示connectSocket、request、uploadFile、downloadFile

关于 vue2 可以参考文档 处理,后续也会发布 vue2 的 API promise 处理

使用ts定义request的返回值类型还是会有不准确的问题啊

具体讲一下

await uni.request({ url: 'https://fc-mp-8ba27ec2-89fd-48c2-ba92-9c9aca.next.bspapp.com/api/user/getU' }) 请求云对象url化,ts推断返回的是RequestTask类型,不能使用await,虽然这个api不使用success就promise化了,所以我不得不使用await new Promise((resolve)=>{ uni.request({ success: (res)=>{ reslove(res.data as Type) //我的ts实在是太烂了,没有更好的处理方案 } }) })

你使用的 @dcloudio/types 是什么版本?如果没有传 success 返回应该是 Promise

luokang2015 commented 1 year ago

@dcloudio/types@3.3.1 已发布: 支持 API 的 Promise 化 ts 提示connectSocket、request、uploadFile、downloadFile

关于 vue2 可以参考文档 处理,后续也会发布 vue2 的 API promise 处理

使用ts定义request的返回值类型还是会有不准确的问题啊

具体讲一下

await uni.request({ url: 'https://fc-mp-8ba27ec2-89fd-48c2-ba92-9c9aca.next.bspapp.com/api/user/getU' }) 请求云对象url化,ts推断返回的是RequestTask类型,不能使用await,虽然这个api不使用success就promise化了,所以我不得不使用await new Promise((resolve)=>{ uni.request({ success: (res)=>{ reslove(res.data as Type) //我的ts实在是太烂了,没有更好的处理方案 } }) })

你使用的 @dcloudio/types 是什么版本?如果没有传 success 返回应该是 Promise

"@dcloudio/types": "^3.3.3",已经是最新版本的。当然没有传success这类参数的,ts自动推断的类型是RequestTask

Megasu commented 1 year ago

持续关注该问题。👀

StrivingRabbit commented 1 year ago

@luokang2015 @Megasu

将附件中的 js 文件放到项目根目录,然后在 main.js 中这样使用即可:

import App from './App'
import Vue from 'vue'
import './uni.promisify.adaptor' // Look here
Vue.config.productionTip = false
App.mpType = 'app'
const app = new Vue({
  ...App
})
app.$mount()

uni.promisify.adaptor.js.zip

luokang2015 commented 1 year ago

@luokang2015 @Megasu

将附件中的 js 文件放到项目根目录,然后在 main.js 中这样使用即可:

import App from './App'
import Vue from 'vue'
import './uni.promisify.adaptor' // Look here
Vue.config.productionTip = false
App.mpType = 'app'
const app = new Vue({
  ...App
})
app.$mount()

uni.promisify.adaptor.js.zip

1683885104995 HBuilderx自己推断的类型是这个,

StrivingRabbit commented 1 year ago

在 hx 中用的啊,那升级 hx 到 3.8.2 试试看

luokang2015 commented 1 year ago

在 hx 中用的啊,那升级 hx 到 3.8.2 试试看

哈哈,那算了,等正式版再升级,