У меня есть тип функции, который может возвращать void
или Promise<void
:
export type CommandHandler = (values: CommandValues) => void | Promise<void>;
Я пытаюсь использовать его для функции void:
export const handler = (values: CommandValues): CommandHandler => {
console.info(`hello ${values.name}`);
};
Но он плачет по поводу CommandHandler
:
Функция, объявленный тип которой не является ни «неопределенным», ни «недействительным», ни «любым», должна возвращать значение.
Я не понимаю. Я указал, что функция может быть void
в типе. Почему он жалуется на это?
Я ожидаю, что ошибки не будет из-за того, как я набрал функцию.
Кроме того, const handler = (values: CommandValues): CommandHandler => ...
здесь не имеет смысла. Вы хотели использовать const handler: CommandHandler = (values: CommandValues) => ...
?
(values: CommandValues): CommandHandler =>
— это функция, которая возвращает CommandHandler
. Это не CommandHandler
само по себе. Мне кажется, это просто опечатка или что-то в этом роде. Итак, (x: string): number => x.length
правильно, а (x: string): (x: string) => number => x.length
нет.
Я не согласен с тем, чтобы не использовать => void | Promise<void>
. Часто возникают ситуации, когда вы не используете возврат обратного вызова и не ожидаете его, и разумно не заботитесь о том, является ли функция синхронной или асинхронной.
@RobertSandiford это значит, что ты просто хочешь void
.
Странный. Я знаю, что бывали случаи, когда тип => void не принимал асинхронную функцию, но сейчас я не могу ее воспроизвести. Интересно, делаю ли я что-то не так?
@VLAZ нет, потому что функция может использовать данные из синхронных или асинхронных источников. Это для платформы, поэтому подумайте о функции CLI, которая может использовать или не использовать базу данных.
Подпись @RobertSandiford, возвращающая void
, принимает любой другой тип возвращаемого значения. Компилятор просто не позволяет вам использовать значение, полученное при вызове функции: github.com/microsoft/TypeScript/wiki/…
Да, я знаю. Но в некоторых случаях правила более строгие — например, аннотация типа возвращаемого значения непосредственно в функции. Я помню, что если у вас есть функция с типом возврата void, а затем сделать ее асинхронной, вам придется обновить ее до Promise<void>. Возможно в других местах я делал что-то лишнее, так что проверю в будущем. Спасибо.
: CommandHandler
в вашем коде ниже указывает тип возвращаемого значения. TS ожидает, что функция вернет функцию на основе этого типа.
export const handler = (values: CommandValues): CommandHandler => {
console.info(`hello ${values.name}`);
};
То, что вам, вероятно, нужно, это приведенное ниже, чтобы обеспечить ограничение типа для всей функции.
export const handler: CommandHandler = (values: CommandValues) => {
console.info(`hello ${values.name}`);
};
«У меня есть тип функции, который может возвращать void или Promise<void», это серьезный запах дизайна. Не делайте свои функции асинхронными по желанию: Обратные вызовы, синхронные и асинхронные | Разработка API для асинхронности | Намеренно развязываю Залго синхронными обещаниями