我有一个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);
});
}
然而,这会导致下面的错误消息(请注意消息的差异取决于表达式中我在哪里悬停):
如果有人对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承诺库时
答案 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;
}
}
我没有看到为什么它不起作用的任何理由。但万一 - 发表评论。