用打字稿推断类型的问题

时间:2017-04-15 23:31:59

标签: typescript bluebird

我有一个TypeScript函数可以删除"路径"在Firebase数据库中。它返回一个Promise,然后解析为一个布尔标志,指示内容是否实际上在那里(如果它不存在则不需要删除)。

该功能如下所示:

export function remove(path: string): Promise<boolean> {
  return exists(path)
    .then(existance => {
      return existance
        ? getRef(path).remove()
          .then(() => Promise.resolve(true))
        : Promise.resolve(false);
    })
    .catch((err: any) => {
      console.log(`There was an error trying to remove the path "${path}": `, err);
      return Promise.reject(err);
    });
}

然而,这会导致下面的错误消息(请注意消息的差异取决于表达式中我在哪里悬停):

enter image description here

如果有人对exists()函数感兴趣 - 哪个,顺便说一句,对TypeScript没有任何问题 - 那就是:

export function exists(path: string): Promise<boolean> {
  return getRecord(path)
    .then(snap => snap.val()
      ? Promise.resolve(true)
      : Promise.resolve(false)
    )
    .catch(Promise.reject);
}

无论如何,我不知道为什么我会收到这些错误,并且会喜欢任何人可能有的洞察力。

  

P.S。我正在使用TypeScript 2.2.2

更新:正如评论中指出的那样......这些错误似乎只发生在使用流行的Bluebird承诺库时

2 个答案:

答案 0 :(得分:1)

目前有一些不太直观的方法可以让Bluebird承诺覆盖TypeScript提供的全局Promise。这个问题在这里讨论:

简而言之,我的问题更多的是在某些案例中使用Bluebird Promises的影响,而在其他案例中使用本机Promise。为了强制使用Bluebird,一个有效的解决方案是:

/ SRC / [ⅩⅩⅩⅩ]的.js

import * as Bluebird from './bluebird';

/src/bluebird.js

declare module 'bluebird-global' {
  import * as Bluebird from 'bluebird';
  global { export interface Promise<T> extends Bluebird<T> {} }
}

通过这种方式,您应该始终获得Bluebird承诺,并避免我遇到的错误。

更新......更好的解决方案。包含@types/bluebird-global模块,您就完成了!

  

注意:如果您在tsconfig.js文件中使用&#34;类型&#34;参数(大多数没有)然后将 bluebird-global 添加到以下部分:

types: [
  "bluebird-global"
]

答案 1 :(得分:0)

很难说。太多的回调地狱。尝试使用现代javascript:

export async function remove(path: string): Promise<boolean> {
    try {
        const e: boolean = await exists(path);
        if (e) {
            await getRef(path).remove();
            return true;
        } else {
            return false;
        } 
    } catch (err) {
        console.log(`There was an error trying to remove the path "${path}": `, err);
        throw err;
    } 
}

我没有看到为什么它不起作用的任何理由。但万一 - 发表评论。