使用打字稿推断类型的问题
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"
]
我有一个 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"
]