0

TypeScript: Разница между возвращаемым типом void и Promise<void> для асинхронных функций

13

Вопрос: В чем разница между типами 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 ответ(ов)

0

Да, есть разница.

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>.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь