Пропуск возврата в асинхронной типизированной функции - PullRequest
0 голосов
/ 09 мая 2018

Давайте рассмотрим пример:

export async function foo(): Promise<string>{
  await bar()
  return;
}

Компилируется без ошибки.

Тогда

export async function foo(): Promise<string>{
  await bar()
}

приводит к ошибке

Функция, объявленный тип которой не является ни void, ни any, должна возвращать значение

1) Почему?

Я думаю, это что-то с https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#63-function-implementations

и усложняется использованием асинхронности, машинописи и ее набора?

UPDATE:

К вашему сведению, когда функция имеет return;, не имеет return (или даже имеет return undefined;), то же самое с точки зрения семантики, верно?

Ответы [ 5 ]

0 голосов
/ 10 мая 2018

Если вы действительно хотите иметь строгую проверку типов, вы должны установить

    "strictNullChecks": true

в вашем tsconfig.json файле.

, если у вас есть такая функция

async function (): Promise<string> {
   return; // same as return undefined
}

если в вашем tsconfig.json значение `strictNullChecks" не установлено в значение true, компиляция пройдет без ошибок.

Проверьте docs / handbook / compiler-options.html

0 голосов
/ 09 мая 2018

Смысл явного предоставления типа возврата, отличного от Void или Any, заключается в том, что вы хотите обеспечить безопасность типов. И вы неявно говорите компилятору, что вы действительно хотите что-то вернуть. Вот почему компилятор ожидает, что вы это сделаете, и жалуется, когда вы этого не делаете. Это определено в спецификации TypeScript раздел 6.1 :

Функция с явным типом, тип возвращаемого значения которой не является типом Void, типом Any или типом объединения, содержащим тип Void или Any в качестве составной части, должен иметь хотя бы один оператор возврата где-то в своем теле

Что касается вашего вопроса относительно return, вы правы.

return; и return undefined; имеют одинаковый результат, определенный в спецификации ECMAScript раздел 13.10 :

Если выражение не указано, возвращаемое значение не определено.

Пропуск оператора return также имеет тот же эффект, как определено в разделе 9.2.1 . Шаг 11 в основном говорит, что undefined возвращается, если больше ничего не было возвращено (Шаг 9) или не было выдано исключение (Шаг 10).

Так что, хотя ваши примеры приводят к тому же результату (возвращающему undefined) в JavaScript, они семантически отличаются для компилятора TypeScript (второй пример. Ничего не возвращает).

0 голосов
/ 09 мая 2018

Это на самом деле не относится к async/await, пустой возврат обрабатывается как return undefined. Так что это также работает:

function foo(): string{
    return; // equivalent to return undefined;
}

Если вы используете strictNullChecks, вы получите сообщение об ошибке, так как undefined нельзя присвоить string

Если вы полностью опустите возврат, компилятор выведет тип возврата как void, который отличается от объявленного типа string, и, таким образом, это будет ошибкой. То же самое относится, если функция async и возвращает Promise

0 голосов
/ 09 мая 2018

Используя аннотацию возвращаемого типа (: Promise<string>), вы говорите, что функция вернет что-то (обещание, которое может разрешиться в строку в будущем), поэтому функция без оператора return явно противоречит эта аннотация / намерение.

Чтобы пометить функцию как ничего не возвращающую, вы можете вместо этого использовать аннотацию : void, но это может вызвать другую ошибку из-за невозможности привести неопределенное к Обещанию), поэтому в этом случае : Promise<void> может быть более уместно.

В вашем примере не имеет значения, что у вас есть пустое выражение return, потому что с функцией async, если вы возвращаете значение, не являющееся обещанием, оно автоматически будет заключено в обещание, поэтому return; все еще будет корректным с точки зрения компилятора.

0 голосов
/ 09 мая 2018

Вы должны использовать Promise<void>, если не планируете вернуть обещание.

...