如何在打字稿中正确编写有条件的 promise.resolve?

Posted

技术标签:

【中文标题】如何在打字稿中正确编写有条件的 promise.resolve?【英文标题】:How to write a conditional promise.resolve properly in typescript? 【发布时间】:2021-07-05 06:55:16 【问题描述】:

我有一个使用 typescript 进行原生反应的项目,我想使用 Promise.resolve().then() 的对象,其条件会导致 typescript 出现类型错误。以下是情况:

我有第一个对象(作为样本):

const objectA = async () => 
  // get the object from local storage
  const user = await asyncStorage.getItem(userAKey)

  return 
    // types are all in string
    id: user?.id || '',
    email: user?.email || '',
  

我有我的第二个对象(作为示例):

const objectB = async () => 
  // get the object from local storage
  const user = await asyncStorage.getItem(userBKey)

  return 
    // types are all in string
    id: user?.id || '',
    email: user?.email || '',
    organisation: user?.organisation || ''
  

所以这两个对象都有不同的类型和具有值的键。这就是问题所在,我有一个条件是根据某种主机类型检查要解析的对象:

const objectTobeResolved = type === 'primary' ? objectA : objectB

因此,基于该条件,我将其传递给 Promise:

const userData = () => 
   Promise.resolve(objectTobeResolved).then((values) =>  ... )

我会在objectTobeResolved 的打字稿中看到类型错误。 基本上这里的类型错误提到了objectA | objectB之类的东西,但我实际上只需要根据上述条件传递一个对象,我不需要objectA | objectB条件,因为它只是objectA或@ 987654331@ 基于我在应用启动器中声明的主机类型。

由于我刚刚学会使用 Typescript,我不太明白如何在 typescript 中正确声明它。

在这里写承诺的正确方法是什么?我应该改用race 还是all?但我一次只需要检查一个对象。或者我应该以某种方式声明或初始化?或者我什至根本不需要使用promise

编辑:我已将上面的代码更新为我的真实案例。 代码实际上运行正确,只是类型错误不断出现,我无法通过测试。一个捷径是使用 //@ts-ignore,但由于我们的做法是不忽略警告,所以我试图找到一种正确的方法来编写它,而不会出现导致测试失败的警告。

【问题讨论】:

看起来你的类型提示是错误的。你能把它定义的行也贴出来吗? 首先,您应该真正考虑为什么要这样做。除非您有非常特殊的需要,否则Promise.resolve(value).then((value) => ) 相当于直接使用value。其次,由于您编写的代码在 TS 中可以正常工作并完美编译,因此我们看不到代码中应该发生了其他事情 这是一个不错的问题,但我们确实需要完整的代码示例。 请在minimal reproducible example 上发布完整代码。目前尚不清楚在哪里评估条件以及在哪里定义调用then 的函数。 objectAobjectB 都是承诺返回函数,所以会期望像 (type === 'primary' ? objectA() : objectB()).then(values => ...) 这样的东西。 【参考方案1】:

更多代码会有所帮助,但我认为您可能要问的是如何创建联合类型,以便您可以有效地将结果引用为 this 或 that。如果是这样,也许你可以使用这样的东西?我相信你也可以用其他一些方式来表达它,但我只是想说明这一点。

const objectA = 
    a: 1,
    b: 2,


const objectB = 
    c: 3,
    d: 4,
    e: 5,


interface ABtype 
    a: Number
    b: Number


interface CDEtype 
    c: Number
    d: Number
    e: Number


interface ABpromiseType extends Promise<ABtype> 


interface CDEpromiseType extends Promise<CDEtype> 


interface ABCDEunionTypeCombined extends Promise<CDEtype | ABtype> 


// Something randomly true or false.
let conditionalCheck = new Date().getTime() % 2 == 0;

const someFunction = () => 
    const objectTobeResolved : ABCDEunionTypeCombined  = (conditionalCheck ? Promise.resolve(objectA) : Promise.resolve(objectB) );

【讨论】:

以上是关于如何在打字稿中正确编写有条件的 promise.resolve?的主要内容,如果未能解决你的问题,请参考以下文章

如何在打字稿中正确使用 lodash-es?

如何在打字稿中正确导入自定义类型

如何在打字稿中声明函数类型

更新可观察打字稿中的数组值

有没有更好的方法在打字稿中编写这种递归方法

对象打字稿中的条件类型