最后,Promise类型中缺少属性

Loi*_*nen 7 finally typescript es6-promise

我很确定自己可以解决这个问题,但是如果它可以帮助其他人,我想分享并节省其他人的时间。

我必须添加es6-promise库才能摆脱此错误

Promise only result to a type, but is only used as a value here.
Run Code Online (Sandbox Code Playgroud)

当我尝试使用Promise.all时(请参阅此讨论)。到现在为止,它运行良好,尝试使用MongoDB中的Promise时出现错误。

Promise<whatever> is not assignable to Promise<any>
    Property 'finally' is missing in type Promise<whatever>
Run Code Online (Sandbox Code Playgroud)

根据es6-promise上的这个问题(如果我没做错的话),新的finally属性将破坏兼容性。它在Promise Mongo退货单上存在,但不在我从es6-promise导入的那张上。

任何的想法?

Jam*_*rch 6

我是注意到finally垫片在该链接问题上破坏了 Promise 兼容性的人。很高兴看到这得到了一些关注。以下是一些选项:

1. 纯粹依赖 TypeScript 核心库的类型

tsconfig.json

{
    "compilerOptions": {
        "lib": ["DOM","ES5","ScriptHost", "es2018.promise"]
    }
}
Run Code Online (Sandbox Code Playgroud)

安装 shim,在应用程序启动时运行一次 polyfill,然后使用全局Promise对象,而不是继续Promisees6-promise. 我发现这是最具互操作性的方式。

npm install --save es6-promise@latest
Run Code Online (Sandbox Code Playgroud)

请注意,es6-promise在最近的几个版本中,它捆绑了自己的类型,这些类型与 TypeScript 的内置Promise库的类型冲突。

2. 使用es6-promise不包含finally垫片的旧版本

注意:当然这意味着你不能使用 finally

{
    "compilerOptions": {
        "lib": ["DOM","ES5","ScriptHost"]
    }
}
Run Code Online (Sandbox Code Playgroud)

es6-promise在他们引入之前安装最后一个版本finally,并使用这些类型:

npm install --save es6-promise@4.2.2 && npm install --save-dev @types/es6-promise@0.0.32
Run Code Online (Sandbox Code Playgroud)

(或者以其他方式省略这些类型并添加es2015.promise到您的compilerOptions.lib数组中tsconfig.json。)


Tit*_*mir 1

如果您需要的只是 a 的正确类型定义,Promise那么您可以只使用 typescript 附带的内置定义(我这样说是因为您注意到您实际使用的 Promise 具有finally预期的方法)。

为此,请删除es6-promise您的项目并将tsconfig您的库更改为:

{
    ....
    "lib": ["es5","es2015.promise","dom", "scripthost"] 
    ....
} 
Run Code Online (Sandbox Code Playgroud)