Почему () => Promise <undefined>присваивается () => void? - PullRequest
4 голосов
/ 29 апреля 2020

Почему это не приводит к ошибке компилятора?

function foo(): () => void {
    return () => Promise.resolve();
}

Этот конкретный случай важен, потому что, когда функция возвращает обещание, вызывающая сторона должна знать, что функция не "выполнена" до тех пор, пока обещание не разрешится или не отклонится.

Обещания связаны с тем, почему это проблема в кодовой базе, на которую я смотрю, но кажется, что сочетание void и типов функций в целом требует особого подхода, что я не понимаю С какой стати первая строка в следующей ошибке, а не вторая?

const y: void = 3;             // error
const x: () => void = () => 3; // OK

Я неправильно понимаю явление? Это ошибка TypeScript?

1 Ответ

4 голосов
/ 29 апреля 2020

В качестве простого объяснения: если вы используете () => void в качестве типа обратного вызова, то это означает, что вы просто не ожидаете возвращаемого значения.

Вы просто хотите выполнить функцию, которая не имеет аргументов.

Итак, поскольку вы также можете обычно вызывать функции, которые возвращают что-то , а затем просто игнорировать возвращаемое значение, из этого следует, что любая функция, которая возвращает что-то, может использоваться вместо функции, помеченной как возвращающая void.

Это может удивить с точки зрения других языков, где возвращаемый тип имеет значение для компиляции. Однако учтите, что TypeScript укореняется в JavaScript, и там функция, возвращающая «ничто» (function f() { return; }), фактически все равно возвращает undefined. Таким образом, все JS функции возвращают что-то, с этой точки зрения.

Вот аналогичное объяснение непосредственно из TypeScript FAQ :

Другой способ думать о том, что тип обратного вызова, возвращающий пустоту, говорит: «Я не собираюсь смотреть на ваше возвращаемое значение, если оно существует».

Итак, void означает «нет ограничений на возвращаемый тип "здесь.

Если вы хотите вместо запретить любой возвращаемый тип, тогда используйте () => undefined, то есть минимальный тип, который будет возвращен в любом случае, даже void функция.

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