promise.prototype.finally的TypeScript类型定义

jpi*_*son 5 typescript definitelytyped es6-promise

我在一个Node应用程序中使用这个ES6 Promise最终实现名为promise.prototype.finally,我希望将其转换为TypeScript,但是我可以在DefinitelyTyped上找到此类包的可用类型.在这些情况下,我只为我需要的功能子集编写了自己的即兴类型定义,但在这种情况下,它是一个修改Promise对象原型的库,我没有遇到任何传统方式来表示这个在TypeScript中.有任何想法吗?

可能相关:

Tom*_*cer 15

虽然Slava的答案是正确的,但它只涉及finally块的输入.要将填充程序实际合并到代码中,以便可以编写p.finally(() => { ... }),则需要调用填充程序.

不幸的是,DefinitelyTyped上打字目前不支持该shim功能,所以在支持之前,我建议你自己添加这些打字.

declare interface Promise<T> {
  finally<U>(onFinally?: () => U | Promise<U>): Promise<U>;
}

declare module 'promise.prototype.finally' {
  export function shim(): void;
}
Run Code Online (Sandbox Code Playgroud)

这些类型现在可用.安装时

npm install --save-dev @types/promise.prototype.finally
Run Code Online (Sandbox Code Playgroud)

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

import { shim } from 'promise.prototype.finally';
shim();
Run Code Online (Sandbox Code Playgroud)

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


mas*_*asi 10

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

请注意,TS 2.7尚未完全(2018年2月26日)与ES2018兼容.虽然还有一些东西缺失,但Promise.finally已经进入2.7版本.此外,tsconfig-schema应该已经接受ES2018作为目标,但TS 2.7不了解ES2018.现在使用新的功能,如Promise.finally,这已经是2.7,你必须使用"target": "ESNEXT"你的tsconfig.json.

然后你就可以编写这样的代码了:

myAsyncFunction().then
(
  (var) => console.log("executing then. " + var)
)
.catch
(
  (var) => console.log("executing catch. " + var)
)
.finally
(
  () => console.log("executing finally.")
)
Run Code Online (Sandbox Code Playgroud)

请注意,由于它的性质,最终不会采取任何参数.

重要提示:虽然TS会正确转换并了解您正在做什么,但仍需检查您的JS-Engine是否支持Promise.finally.在我的情况下,我使用NodeJs 8.x,当然生产的JS不可执行,因为Promise.Finally从最新的NodeJs 10.x开始支持每晚构建 Node 10.x(稳定),请参阅此链接.


Sla*_*lny 1

您可以编写自己的 d.ts 文件并在 tsconfig.json 文件中引用它。如果你这样做了,你就可以为像你这样的其他人的DefinitelyTyped git 做出贡献

更新:

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

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

declare module 'es6-promise/dist/es6-promise' {
    export interface Promise <R> {
      finally?<U>(onFinally?: () => U | Promise<U>): Promise<U>;
    }
}
Run Code Online (Sandbox Code Playgroud)

而且它应该可以正常工作......

我为您创建了一个项目作为示例: promise-extension-typescript-example

我创建了一个到 DefinelyTyped git 存储库的拉取请求,希望它能被接受,你可以从那里下载它......