Я переношу простой модуль узла 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, с классифицированныминформация и логика отключены.