В асинхронной функции отсутствует оператор возврата? - PullRequest
0 голосов
/ 28 апреля 2018

Я только что закончил писать следующий метод для ошибки, с которой я работаю, и мне было интересно, почему компилятор не жаловался на то, что следующая функция может не возвращаться? Если я вместо этого напишу if (false), компилятор немедленно пожалуется, что не все пути возвращают значение.

Что произойдет, если if (data && data.json().length) неверно? Эта функция возвращает что-нибудь?

private async getData(items: any[]): Promise<number> {
    for(const item of items) {
        let data = await item.promise;
        if (data && data.json().length) {
            return data.json().findIndex(d => d.fqdn);
        }
    }
}

Спасибо

Ответы [ 3 ]

0 голосов
/ 28 апреля 2018

Раздел 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, когда эта опция включена.

0 голосов
/ 28 апреля 2018

async функции всегда возвращают обещание. В случае if (false) компилятор TypeScript жалуется, потому что оператор return недоступен. Функция возвращает обещание undefined в этом случае. Это также происходит, если data && data.json().length имеет значение false, но эта проблема не может быть обнаружена компилятором.

Функция не требует явного return в конце функции, если она не имеет значения по умолчанию для возврата, но она должна быть набрана соответственно:

private async getData(items: any[]): Promise<number|void> {
    for(const item of items) {
        let data = await item.promise;
        if (data && data.json().length) {
            return data.json().findIndex(d => d.fqdn);
        }
    }
}
0 голосов
/ 28 апреля 2018

Функция всегда возвращает обещание. В случае если функция неявно возвращается, Обещание будет разрешено до неопределенного.

При включенном strictNullChecks это должно привести к ошибке компиляции.

Это можно увидеть на игровой площадке TypeScript (попробуйте переключить strictNullChecks в настройках):

async function a(i: boolean): Promise<number> {
    if (i) return 5;
}

Вы также можете удалить ключевое слово async и изменить тип возвращаемого значения на number, и вы увидите то же поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...