Typescript TSC получает ошибку «никогда» в обещании es6? - PullRequest
0 голосов
/ 26 июня 2018

Я переношу простой модуль узла JavaScript и код сервера, который использует его в TypeScript, но что-то действительно странное происходит как-то ...

Я использовал приведенный ниже синтаксис цепочки обещаний:

api.Promise1().then(resultOfPromise1 =>
       resultOfPromise1.isGood() ?
         api.Promise2() :
         Promise.reject({some:"errorInfo"})
       ).then(resultOfPromise2 => {
         resultOfPromise2.doSomeThing();
       }).catch(e => {
          // Handle exception.
       });

И tsconfig.json, как показано ниже:

{
        "compilerOptions": {
            "lib": [
                "es2015","es2016.array.include","es2017.string","es2015.promise"
            ]
        }
}

с кодами выше, tsc дал мне странную ошибку, утверждающую, что resultOfPromise2 может иметь тип 'never':

error TS2339: Property 'doSomeThing' does not exist on type 'never'.

Но дажес этой ошибкой, скомпилированный .js работает нормально, как и ожидалось.

Может ли это быть проблемой tsc или я что-то потерял?

ОБНОВЛЕНИЕ Вот сокращенная версия кода, который компилируется без каких-либо ошибок:

class SqlResult{
    result: string;
}

function doSqlQuery(query: string): Promise<SqlResult>{
    return new Promise((res, rej) => {
        setTimeout(() => {
            if (Math.random() > 0.5) {
                res({ result: "123" });
            } else {
                rej(new Error("SQL "));
            }
        }, 20);
    });
} 

class Api{
    Promise1():Promise<string>{
        return doSqlQuery("").then(result => Promise.resolve(result.result))
    }
    Promise2():Promise<string>{
        return doSqlQuery("").then(result => Promise.resolve(result.result))
    }
}

var api = new Api();

api.Promise1().then(resultOfPromise1 =>
    resultOfPromise1 == "QOO" ?
        api.Promise2() :
        Promise.reject({ some: "errorInfo" })
).then(resultOfPromise2 => {
    console.log(resultOfPromise2);
}).catch(e => {
    console.error(e);
});

Я возьму некоторое время, чтобы выложить полный код на Github, с классифицированныминформация и логика отключены.

1 Ответ

0 голосов
/ 26 июня 2018

Съемка в темноте, но вы можете попробовать это:

npm i --save-dev  @types/es6-promise

и добавьте:

import {Promise} from 'es6-promise'
...