2016-03-08 214 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

相關問題