2016-03-08 143 views
3

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

可能相关:

回答

1

你可以写自己的d.ts文件和tsconfig.json文件中引用它。 你做它,你可以向DefinitelyTyped混帐别人自己

更新这样的:如果我理解你的意思是正确的你可以在自己的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>; 
    } 
} 

它应该正常工作...

我创建了一个项目,你作为一个例子: promise-extension-typescript-example

我创建向DefinitelyTyped git存储库提出请求,希望它能被接受,并且可以从那里下载它...

+0

我非常清楚这些观点。我在上面描述的情况特定于那个修改现有对象/类而不是定义一个新类型或一组类型的包。 – jpierson

+0

我的更新是你的吗? –

+0

我不确定'Thenable',但是我正在使用ES6 polyfill'es6-promise'中定义的承诺,但_promise.prototype.finally_应该支持任何与ES5兼容的承诺实现。我正在使用的类型是Promise 。在上面的实现中用Then承诺代替Thenable对我来说不起作用,因为tsc在导入的Promise polyfill'import {Promise} from'es6-promise';'的站点给了我一个错误。 – jpierson

6

虽然Slava的回答是正确的,它只处理finally区块的输入。要真正将垫片加入代码中,所以您可以编写p.finally(() => { ... }),您需要调用垫片。

不幸的是 typings on DefinitelyTyped目前不支持 shim函数,所以 until this is supported,我建议你自己添加类型。

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

declare module 'promise.prototype.finally' { 
    export function shim(): void; 
} 

的类型等,应有尽有。与

npm install --save-dev @types/promise.prototype.finally 

在您的打字稿代码安装,在应用程序的引导,你可以调用

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

这将finally块添加到Promise原型,让您使用finally要求。

+0

Uhm我无法使用Visual Studio代码1.20工作 - 它会建立,但是当运行代码时,我会得到一个“无法找到模块”promise.prototype.finally '“错误,altought模块在node_modules @ types中可用。不知道是否值得研究,因为https://github.com/Microsoft/TypeScript/issues/20411最后为“finally”增加了本地支持。 – masi

1

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

请注意,TS 2.7尚未完全兼容(201年2月26日)ES2018兼容。虽然还有一些东西missingPromise.finally made it into the 2.7 release。此外,tsconfig-schema应该已经接受ES2018作为目标,但TS 2.7不知道ES2018。现在要使用Promise.finally等新功能,这些功能已经在2.7,中,您必须在您的tsconfig.json中使用"target": "ESNEXT"

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

myAsyncFunction().then 
(
    (var) => console.log("executing then. " + var) 
) 
.catch 
(
    (var) => console.log("executing catch. " + var) 
) 
.finally 
(
() => console.log("executing finally.") 
) 

注意如何finally will not take any arguments,由于它的本性。

重要:虽然TS将正确地传输并理解你在做什么,但你仍然需要检查你的JS-Engine是否支持Promise.finally。在我的情况下,我使用NodeJs 8.x,当然生成的JS不可执行,因为Promise.Finally只支持最新的NodeJs 10.x每晚构建,see this link

相关问题