компилируется без ошибок в машинописном 2.1.5:Разве TypeScript не гарантирует, что обещание разрешено с правильным типом?
function promiseANumber(): Promise<number> {
return new Promise(resolve => resolve('definitely not a number'));
}
Я ожидал бы ошибкой сообщаться, так как функция решительность вызывается со строкой вместо числа, в соответствии с определением типа.
Почему этот тип несоответствия не обнаружен и не передан компилятором TypeScript?
Edit 1
Глядя на это немного больше, используя определение функции асинхронной вместо компилятор правильно сообщает несоответствие типов. Так что это:
async function promiseANumber(): Promise<number> {
return 'definitely not a number';
}
дает
error TS2322: Type '"definitely not a number"' is not assignable to type 'number'.
Почему эти дела ведут себя по-другому?
Edit 2
Похоже способ сделать компилятор правильно поймать этого явно сказать ему, какой тип обещания вы возвращения. Так что это достаточно:
function promiseANumber() {
return new Promise<number>(resolve => resolve('definitely not a number'));
}
который компилятор в настоящее время жалуется:
error TS2345: Argument of type '"definitely not a number"' is not assignable to parameter of type 'number | Thenable<number>'.
Я полагаю, мой вопрос сейчас, почему не может компилятор выводить это, учитывая определение, которое я дал в начале этого вопроса?
Редактировать 3
К счастью, машинопись 2,4 теперь указывает на правильную ошибку для исходного кода! Это связано с его поддержкой return types as inference targets. У этого объявления даже есть образец кода, очень похожий на пример, который я дал изначально.
В вашем первом примере вы можете явно написать тип, т. Е. 'Const myPromise: Promise = ...'. Это эквивалентно моему первому примеру в моем вопросе. Но это все еще не помогает компилятору. Зачем? –
markrian
@markrian Я обновил свой ответ. –
Я вижу, спасибо. Жаль, что компилятор не делает вывод о том, что обещанное обещание - это Promise, основанный на сигнатуре окружающей функции. Это технически невозможно, по какой-то причине, или просто текущее ограничение TypeScript? –
markrian