TypeScript: Разница между возвращаемым типом void и Promise<void> для асинхронных функций
Вопрос: В чем разница между типами void
и Promise<void>
в TypeScript?
Я запутался, почему следующий код является допустимым в TypeScript:
const asyncFunc: () => void = async () => {
await new Promise(resolve => resolve());
};
Неужели это не должно быть допустимо только в следующем случае?
const asyncFunc: () => Promise<void> = async () => {
await new Promise(resolve => resolve());
};
Благодарю за разъяснение!
1 ответ(ов)
Да, есть разница.
void
немного похоже на противоположность any
: это отсутствие какого-либо типа вообще. Обычно вы можете увидеть это в качестве возвращаемого типа функций, которые ничего не возвращают.
Что касается Promise<void>
, то, думаю, это не требует объяснений.
Теперь, почему присваивание в вопросе допустимо? Потому что целевая функция (() => void
) может быть вызвана во всех (почти) тех же ситуациях, что и исходная функция. Рассмотрим упрощенный пример:
declare let voidFunc: () => void;
declare let promiseFunc: () => Promise<void>;
voidFunc = promiseFunc; // OK
promiseFunc = voidFunc; // Ошибка: Тип 'void' не может быть назначен типу 'Promise<void>'
Таким образом, функция, возвращающая void
, является более универсальной и совместима с функцией, возвращающей Promise<void>
. В случае обратного присвоения возникает ошибка, так как void
нельзя использовать вместо Promise<void>
.
Как динамически назначить свойства объекту в TypeScript?
Как удалить элемент массива в TypeScript?
Перегрузка конструктора в TypeScript
Как подавить ошибку "error TS2533: Object is possibly 'null' or 'undefined'"?
Использование async/await с методом Array.map