Получение ошибки: функция, объявленный тип которой не является ни «неопределенным», ни «недействительным», ни «любым», должна возвращать значение

У меня есть тип функции, который может возвращать 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 в типе. Почему он жалуется на это?

Я ожидаю, что ошибки не будет из-за того, как я набрал функцию.

«У меня есть тип функции, который может возвращать void или Promise<void», это серьезный запах дизайна. Не делайте свои функции асинхронными по желанию: Обратные вызовы, синхронные и асинхронные | Разработка API для асинхронности | Намеренно развязываю Залго синхронными обещаниями

VLAZ 21.06.2024 19:20

Кроме того, const handler = (values: CommandValues): CommandHandler => ... здесь не имеет смысла. Вы хотели использовать const handler: CommandHandler = (values: CommandValues) => ...?

VLAZ 21.06.2024 19:23
(values: CommandValues): CommandHandler => — это функция, которая возвращает CommandHandler. Это не CommandHandler само по себе. Мне кажется, это просто опечатка или что-то в этом роде. Итак, (x: string): number => x.length правильно, а (x: string): (x: string) => number => x.length нет.
jcalz 21.06.2024 19:25

Я не согласен с тем, чтобы не использовать => void | Promise<void>. Часто возникают ситуации, когда вы не используете возврат обратного вызова и не ожидаете его, и разумно не заботитесь о том, является ли функция синхронной или асинхронной.

Robert Sandiford 21.06.2024 20:26

@RobertSandiford это значит, что ты просто хочешь void.

VLAZ 21.06.2024 20:28

Странный. Я знаю, что бывали случаи, когда тип => void не принимал асинхронную функцию, но сейчас я не могу ее воспроизвести. Интересно, делаю ли я что-то не так?

Robert Sandiford 21.06.2024 21:19

@VLAZ нет, потому что функция может использовать данные из синхронных или асинхронных источников. Это для платформы, поэтому подумайте о функции CLI, которая может использовать или не использовать базу данных.

kejedi 22.06.2024 06:14

Подпись @RobertSandiford, возвращающая void, принимает любой другой тип возвращаемого значения. Компилятор просто не позволяет вам использовать значение, полученное при вызове функции: github.com/microsoft/TypeScript/wiki/…

VLAZ 22.06.2024 07:23

Да, я знаю. Но в некоторых случаях правила более строгие — например, аннотация типа возвращаемого значения непосредственно в функции. Я помню, что если у вас есть функция с типом возврата void, а затем сделать ее асинхронной, вам придется обновить ее до Promise<void>. Возможно в других местах я делал что-то лишнее, так что проверю в будущем. Спасибо.

Robert Sandiford 22.06.2024 09:55
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
0
9
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

: CommandHandler в вашем коде ниже указывает тип возвращаемого значения. TS ожидает, что функция вернет функцию на основе этого типа.

export const handler = (values: CommandValues): CommandHandler => {
  console.info(`hello ${values.name}`);
};

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

export const handler: CommandHandler = (values: CommandValues) => {
  console.info(`hello ${values.name}`);
};

Другие вопросы по теме

Могу ли я использовать файлы ts точно так же, как я использую файлы js?
Проблема вывода типа с массивом универсальных объектов конфигурации с разными внутренними типами, которые зависят от другого внутреннего свойства
Почему добавление круглых скобок удаляет «только для чтения [x: число]: число;» из этого типа?
Введите 'строка | логическое значение не может быть назначено для ввода «никогда» в машинописном тексте
Как добавить динамические метаданные на страницу [slug] в маршрутизаторе приложений next.js
Программно переключить свойство, нулевое или необязательное, на обязательное в Zod
Кортеж, который принимает только одно вхождение определенного типа
Как указать значение по умолчанию (но не ноль) в числовом типе в форме zod и response-hooks?
Тип «неизвестный» не может быть назначен типу «HttpEvent<any>». Попытка создать перехватчик HTTP в приложении Angular
Next.js revalidateTag, revalidatePath не работает