使用打字稿推断类型的问题

Problems inferring type with typescript

我有一个 TypeScript 函数可以删除 Firebase 数据库中的 "path"。它 return 一个 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);
    });
}

但是,这会导致出现以下错误消息(请注意,消息的差异取决于我悬停在表达式中的位置):

如果有人对 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. i'm using TypeScript 2.2.2


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

很难说。太多的回调地狱。尝试使用现代 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;
    } 
}

我看不出有任何原因它不起作用。但以防万一 - post 发表评论。

目前没有多少直观的方法可以让 Bluebird 承诺覆盖 TypeScript 提供的全局承诺。这个问题在这里讨论:

简而言之,我的问题更多是在 某些 案例中使用 Bluebird Promises 而在其他案例中使用原生 Promises 的影响。要强制使用 Bluebird,一个可行的解决方案是:

/src/[xxxx].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 模块,你就完成了!

Note: if in your tsconfig.js file you're using the "types" parameter (most do not) then add bluebird-global to the section:

types: [
  "bluebird-global"
]