typescript - 如何让打字稿认为已解决的承诺作为 T 型
问题描述
我是打字稿的新手,我正在创建一些东西,并且遇到了使用 javascript 时从未发生过的问题。
假设我们有async
返回的函数Promise<ResultSet>
interface ResultSet {
status: number; // 0 for success 1 for failure
data?: any;
}
const getDataFromServer = async (parameter: string): Promise<ResultSet> => {
const response = await fetch(<--Prameters-->);
return await response.json();
}
它总是将它的值返回为Promise
.
它需要连接到接口,以便某些模块可以使用它。它将使用上面的请求更改全局变量的值。并且需要返回动作结果(成功或失败代码)。它是在某处很多地方使用的行动的结果。
const storeData = async (parameter: string): number => {
const result = await getDataFromServer(parameter);
if (result.status == 0) {
SOME_GLOBAL_VARIABLE.setState({ data: result.data });
}
return result.status;
}
如您所料,上面的函数定义弹出一个错误,async (parameter: string): number
原因函数必须返回 Promise,因为它是async
函数。所以它需要在下面,
const storeData = async (parameter: string): Promise<number> => {
const result = await getDataFromServer(parameter);
if (result.status == 0) {
SOME_GLOBAL_VARIABLE.setState({ data: result.data });
}
return result.status;
}
问题由此开始。因为函数的返回类型为Promise
,与此相关的所有其他函数的接口都必须将该结果状态定义为Promise<number>
not a number
。它将全局影响整个服务器代码。此外,这SOME_GLOBAL_VARIABLE
也data
需要输入为Promise<T>
.
据我所知,没有办法将 Promise 对象转换为普通对象。
我想切断这种无休止的承诺链。有什么办法吗?还是只是我的误解?即使替换async ~ await
为then() ~ catch()
也失败了,因为它似乎也返回了Promise
。
保证其Promise
值是否成功解决。但是,在某些时候,它已经被保证为 Resolve。但是没有办法处理这种情况。
我该如何处理这种情况?使用打字稿时,这似乎很常见。但我不知道该怎么做。
解决方案
这与普通的 JavaScript 没有什么不同,只是 TypeScript 给了它一个名字。
简短的回答是否定的,您不能将对象的承诺转换为对象本身。这不是因为 TypeScript,而是因为 promise API(或异步代码的本质)。
一旦处理了 promises / async / await
,您可以访问 promise 类型的唯一位置是在then
处理程序中(或在 using 之后await
):
// Using promises
storeData().then((result: number) => { /* result is a number here, not a promise of a number */ });
// Using async / await
const result = await storeData(); // again, result is a number, not a promise of a number
因此,为了避免基于您的所有代码承诺,您需要从then
处理程序中(或之后await
)调用它:
// An example of a promise-less function somewhere in your code
const someOtherFunction = (result: number) => { /* do something with your result */ };
storeData().then(result => {
// this works since result is a number here
someOtherFunction(result);
});
你当然可以写一个抽象来包装一个promise,一个对象,比如说一个value
等待promise并value
在解决后设置on本身的属性。但是,您仍然需要等待 promise 解决才能获得分辨率值。
推荐阅读
- common-lisp - 使用局部变量并在嵌套的 Common Lisp 循环中返回它们
- android - 自定义对话框错误
- asp.net-mvc - 在 MVC 控制器中查询 ID 数组
- sql - 如何在一段时间内选择不同的总列数并按created_at对它们进行分组?
- autodesk-forge - 3DS Max 存档导入翻译失败
- python - Scipy 优化 fmin ValueError:使用序列设置数组元素(2)
- python - Tensorflow 实时对象检测 - 需要优化建议
- javascript - 如何在包含背景的顶部放置宽度、高度的 div?
- sharepoint - 将项目添加到列表时,我收到错误 Invalid data has been used to update the list item。您尝试更新的字段可能是只读的
- file - Jenkins如何将环境变量设置为参数化构建的原始文件名?