Раздел 6.3 спецификации TypeScript объясняет это (выделение добавлено):
Функция с явным типом, тип возвращаемого значения которой не является типом Void, типом Any или типом объединения, содержащим тип Void или Any в качестве составляющей , должен иметь хотя бы один оператор возврата где-то в своем теле . Исключением из этого правила является то, что реализация функции состоит из одного оператора throw.
Ваша функция имеет один достижимый оператор возврата, поэтому она удовлетворяет этому требованию. Если вы поместите return
внутри if (false)
, он не будет считаться, потому что он недоступен.
В случае, если он завершается без явного возврата, он неявно возвращает обещание для undefined
, которое является допустимым значением для Promise<number>
, если опция strictNullChecks
не включена.
Это не связано с async
. Следующее также компилируется без ошибок:
function getData(): number {
if (1 + 1 === 3) {
return 7;
}
}
Как это сделать:
function getData(): number {
if (1 + 1 === 3) {
return undefined;
}
}
Что произойдет, если (data && data.json (). Length) равно false? Эта функция возвращает что-нибудь?
Возвращает обещание, которое разрешается до undefined
, поскольку оно помечено как async
, а функции async
всегда возвращают обещания.
Обратите внимание, что (как указывал Том Фенек до меня), использование strictNullChecks приводит к тому, что как ваша функция, так и функции, приведенные в этом ответе, приводят к ошибкам компилятора, поскольку undefined
не считается возможным значением number
, когда эта опция включена.