Свойство окончательно отсутствует в типе Promise - PullRequest
0 голосов
/ 04 июля 2018

Я почти уверен, что смогу решить эту проблему самостоятельно, но если это может помочь кому-то еще, я хочу поделиться и сэкономить кому-то еще время.

Мне пришлось добавить библиотеку es6-promise, чтобы избавиться от этой ошибки

Promise only result to a type, but is only used as a value here.

когда я пытался использовать Promise.all (см. это обсуждение ). До сих пор все работало нормально, я получаю сообщение об ошибке, когда пытаюсь использовать Promise от MongoDB.

Promise<whatever> is not assignable to Promise<any>
    Property 'finally' is missing in type Promise<whatever>

Согласно этой проблеме в es6-обещании (если я правильно понял), новое свойство finally нарушает совместимость. Он там, на возврате Promise Mongo, но не на том, который я импортировал из es6-обещания.

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Я тот, кто заметил, что прокладка finally нарушает совместимость с Promise в этой связанной проблеме . Приятно видеть, что это привлекает внимание. Вот несколько вариантов:

1. Положитесь исключительно на типизацию библиотеки ядра TypeScript

tsconfig.json

{
    "compilerOptions": {
        "lib": ["DOM","ES5","ScriptHost", "es2018.promise"]
    }
}

Установите прокладку, запустите полифилл один раз в начале вашего приложения и с тех пор используйте глобальный объект Promise, а не продолжайте импортировать класс Promise из es6-promise. Я обнаружил, что это наиболее совместимый способ.

npm install --save es6-promise@latest

Обратите внимание, что es6-promise в последние несколько выпусков связывал свои собственные типы, которые конфликтуют с типами встроенных в Promise библиотек TypeScript.

2. Используйте более старую версию es6-promise, которая не включает finally shim

Примечание: конечно, это означает, что вы не можете использовать finally

{
    "compilerOptions": {
        "lib": ["DOM","ES5","ScriptHost"]
    }
}

Установите последнюю версию es6-promise до того, как они представили finally, и используйте эти наборы:

npm install --save es6-promise@4.2.2 && npm install --save-dev @types/es6-promise@0.0.32

(Или иначе пропустите эти наборы и добавьте es2015.promise к вашему массиву compilerOptions.lib в tsconfig.json.)

0 голосов
/ 04 июля 2018

Если все, что вам нужно, это правильное определение типа для Promise, тогда вы можете просто использовать встроенные определения, которые поставляются с машинописью (я говорю это, потому что вы заметили, что обещание, с которым вы фактически работаете, имеет finally метод, как и ожидалось).

Для этого удалите es6-promise из проекта и в tsconfig измените вашу библиотеку на:

{
    ....
    "lib": ["es5","es2015.promise","dom", "scripthost"] 
    ....
} 
...