Typescript promise.prototype.finally的类型脚本类型定义

Typescript promise.prototype.finally的类型脚本类型定义,typescript,es6-promise,definitelytyped,Typescript,Es6 Promise,Definitelytyped,我使用的是一个节点应用程序中调用的ES6 Promise compatible finally实现,我想将其转换为TypeScript,但是我在上面找不到可用于此包的键入。在这些情况下,我已经为我需要的功能子集编写了我自己的即兴类型定义,但在本例中,它是一个库,用于修改Promise对象的原型,我还没有遇到任何用TypeScript表示的常规方法。有什么想法吗 可能相关: 您可以编写自己的d.ts文件,并在tsconfig.json文件中引用它。 如果你这样做了,你就可以为像你这样的其

我使用的是一个节点应用程序中调用的ES6 Promise compatible finally实现,我想将其转换为TypeScript,但是我在上面找不到可用于此包的键入。在这些情况下,我已经为我需要的功能子集编写了我自己的即兴类型定义,但在本例中,它是一个库,用于修改Promise对象的原型,我还没有遇到任何用TypeScript表示的常规方法。有什么想法吗

可能相关:


您可以编写自己的d.ts文件,并在tsconfig.json文件中引用它。 如果你这样做了,你就可以为像你这样的其他人提供一个明确类型的git

更新:

如果我正确理解了您的意思,您可以在自己的d.ts文件中扩展现有的
Promise
类。将该方法设置为可选,这样它就不会告诉您实际的
Promise
类没有正确实现接口。 您需要将其扩展为一个接口

您的d.ts文件应该如下所示

declare module 'es6-promise/dist/es6-promise' {
    export interface Promise <R> {
      finally?<U>(onFinally?: () => U | Promise<U>): Promise<U>;
    }
}
声明模块“es6承诺/dist/es6承诺”{
出口接口承诺{
最后?(最终?:()=>U |承诺):承诺;
}
}
它应该能正常工作

我为您创建了一个项目作为示例:


我创建了一个到DefinitelyTyped git存储库的pull请求,希望它能被接受,您可以从那里下载它…

虽然Slava的答案是正确的,但它只处理
最后的
块的键入。要将垫片实际合并到代码中,以便编写
p.finally(()=>{…})
,需要调用垫片

不幸的是,当前不支持
shim
功能,因此,我建议您自己添加打字

在TypeScript代码中,在应用程序引导期间,您可以调用

import { shim } from 'promise.prototype.finally';
shim();

这将把
finally
块添加到
Promise
原型中,允许您根据需要使用
finally

对于想知道如何在没有任何垫片的情况下本机工作的人:从TS 2.7开始,这是可能的

请注意,TS 2.7尚未完全兼容(2018年2月26日)ES2018。虽然还有一些事情。此外,tsconfig模式应该已经接受ES2018作为目标,但TS 2.7不了解ES2018。现在,要使用2.7中已有的新功能,例如Promise.finally,您必须在tsconfig.json中使用
“target”:“ESNEXT”

然后您将能够编写如下代码:

myAsyncFunction().then
(
  (var) => console.log("executing then. " + var)
)
.catch
(
  (var) => console.log("executing catch. " + var)
)
.finally
(
  () => console.log("executing finally.")
)
注意,由于它的性质,它是如何工作的


重要信息:虽然TS将正确传输并理解您正在做的事情,但您仍然需要检查您的JS引擎是否支持Promise.finally。在我的例子中,我使用的是NodeJs 8.x,当然生成的JS是不可执行的,因为从最新的NodeJs 10.x夜间构建Node 10.x(稳定)开始,Promise.Finally是受支持的。

我肯定知道这些要点。我在上面描述的情况是特定于该包的,它正在修改现有的对象/类,而不是定义一个新的类型或类型集。我不确定
Thenable
,但我正在使用ES6 polyfill
ES6 promise
中定义的承诺,但是promise.prototype.finally应该支持任何ES5兼容承诺实现。和我一起工作的是Promise。在上面的实现中用Promise替换表对我不起作用,因为tsc在从“es6 Promise”导入Promise polyfill
import{Promise}的站点上给了我一个错误
。如果查看d.ts文件,您将看到
Promise
实现了
Thenable
。在我给你的代码中,我用一种新的方法扩展了这个接口,正如上面所述,通过编写具有相同名称的新接口来扩展接口似乎与TypeScript编译器不兼容。您可以在此处看到它的工作文件:嗯,我无法使用Visual Studio代码1.20进行此操作-它将生成,但在运行代码时,我将得到一个“找不到模块”promise.prototype.finally“错误,Alt应在节点中提供该模块_modules@types. 不知道这是否值得研究,因为它添加了对“finally”,finally的本机支持。只需使用
warn add@types/promise.prototype.finally--dev
就为我做到了
import { shim } from 'promise.prototype.finally';
shim();
myAsyncFunction().then
(
  (var) => console.log("executing then. " + var)
)
.catch
(
  (var) => console.log("executing catch. " + var)
)
.finally
(
  () => console.log("executing finally.")
)