2016-03-08 3 views
3

Я использовал эту окончательную реализацию ES6 Promise, которая называется promise.prototype.finally, в приложении Node, которое я хочу преобразовать в TypeScript, однако для этого пакета нет набора текста, который я могу найти на DefinitelyTyped. В этих ситуациях я написал свои собственные импровизированные определения типов только для части функциональности, которая мне нужна, но в этом случае это библиотека, которая модифицирует прототип объекта Promise, и я не встречал никакого обычного способа представлять это в TypeScript. Есть идеи?Определение типа типа для prom.prototype.finally

Возможно, связанный с:

ответ

1

Вы можете написать свой файл собственного d.ts и ссылаться на него в файле tsconfig.json , из вас сделать это вы можете внести свой вклад в мерзавец DefinitelyTyped для других, как себя

Update:

Если я правильно понял, что вы имеете в виду вы можете расширить существующий 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>; 
    } 
} 

И он должен работать правильно ...

Я создал проект для Вас в качестве примера: promise-extension-typescript-example

я создал запрос на перенос в репозиторий DefinitelyTyped git, надеемся, что он будет принят, и вы можете скачать его там ...

+0

Я определенно знаю эти моменты. Ситуация, описанная выше, специфична для этого пакета, где он модифицирует существующий объект/класс вместо определения нового типа или набора типов. – jpierson

+0

Мое обновление, что вы? –

+0

Я не уверен в 'Thenable', но я работаю с обещаниями, определенными в ES6 polyfill' es6-prom', но _promise.prototype.finally_ должен поддерживать любую реализацию обещаний, совместимых с ES5. Тип, с которым я работаю, - Promise . Подстановка Thenable с Promise в вашей реализации выше не работает для меня, потому что tsc дает мне ошибку на сайте импорта для Promise polyfill 'import {Promise} из« es6-prom »;'. – 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 Code 1.20 - Он будет построен, но при запуске кода я получу «Не могу найти модуль». Promtotype.finally '", этот модуль доступен в типах node_modules @. Интересно, стоит ли даже исследовать это с тех пор, как https://github.com/Microsoft/TypeScript/issues/20411 добавила встроенную поддержку «наконец», наконец. – masi

1

Для кого-то интересно, как это сделать изначально без каких-либо прокладок: по TS 2.7 это возможно.

Обратите внимание, что TS 2.7 еще не полностью (26. Feb. 2018) ES2018 совместим. Пока еще есть несколько вещей missing, Promise.finally made it into the 2.7 release. Также tsconfig-схема должна уже принимать 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.") 
) 

Обратите внимание, как finally will not take any arguments из-за его характера.

ВАЖНО: в то время как TS будет корректно транслироваться и понимать, что вы делаете, вам все равно нужно проверить, поддерживает ли ваш JS-движок Promise.finally. В моем случае я использовал NodeJs 8.x, и, конечно же, созданный JS не был исполняемым, потому что Promise.Finally поддерживается только в новейших ночных сборках NodeJs 10.x, see this link.

Смежные вопросы