首页 > 解决方案 > 如何让打字稿认为已解决的承诺作为 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_VARIABLEdata需要输入为Promise<T>.

据我所知,没有办法将 Promise 对象转换为普通对象。

我想切断这种无休止的承诺链。有什么办法吗?还是只是我的误解?即使替换async ~ awaitthen() ~ catch()也失败了,因为它似乎也返回了Promise

保证其Promise值是否成功解决。但是,在某些时候,它已经被保证为 Resolve。但是没有办法处理这种情况。

我该如何处理这种情况?使用打字稿时,这似乎很常见。但我不知道该怎么做。

标签: typescriptasynchronouspromise

解决方案


这与普通的 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 解决才能获得分辨率值。


推荐阅读