Возможно ли в TypeScript отключить правило TS (1345)

TypeScript выдаст ошибку («Выражение типа «void» не может быть проверено на истинность.ts(1345)») с допустимым кодом отладки, например:

const getFooPlusTwo = (foo) => console.info(foo) || foo + 2;

Существуют различные приемы, позволяющие обойти это (добавление +, , и т. д.), но они работают не при всех обстоятельствах... и, что более важно, это ненужная работа, не приносящая никакой пользы (JS прекрасно работает без них).

Большинство правил TypeScript можно отключить. Есть ли какое-либо правило TypeScript (или ESLint), которое я могу отключить, чтобы TypeScript не выдавал эти ошибки?

Это не очень читабельно. Почему то, что ты пытаешься сделать?

Daniel A. White 27.08.2024 03:05

Я пытаюсь отладить. Исходная версия функции выглядела так:const getFooPlusTwo = (foo) => foo + 2;. Я использовал (очень распространенный) шаблон отладки, добавив console.info(foo) || , чтобы определить значение аргумента foo. Выглядит, конечно, некрасиво, но и не предполагается: это отладочный код.

machineghost 27.08.2024 03:14

Вы можете дополнить глобальную консоль, заменив там void на undefined — это звучит более эргономично, чем оператор запятая с круглыми скобками. declare global { interface Console { log(msg: any, ...args: any[]): undefined; } }

STerliakov 27.08.2024 03:41

Это звучит как ответ! К сожалению, я первым увидел ответ Джоша, но если вы предоставите это как ответ, я с радостью проголосую за него и изменю свой принятый ответ (если ТАК позволит мне).

machineghost 27.08.2024 03:46
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой 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 для повышения производительности приложения путем загрузки модулей только тогда, когда они...
1
4
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы не сможете отключить это правило машинописного текста, console.info возвращает void, и вы не можете использовать выражение void при проверке правдивости.

Альтернативным вариантом может быть использование оператора запятой для разделения журнала и возврата значения. Оператор запятая оценивает каждый из своих операндов (слева направо) и возвращает значение последнего операнда.

export const getFooPlusTwo = (foo: number) => (console.info(foo), foo + 2);

Это прискорбно: во многих случаях запятая не работает (и опять же, у разработчиков должна быть хотя бы возможность игнорировать ошибки, которые TypeScript создает из ничего). Но спасибо за ответ!

machineghost 27.08.2024 03:44
Ответ принят как подходящий

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

declare global { 
   interface Console { 
      log(msg: any, ...args: any[]): undefined; 
   } 
}

const getFooPlusTwo = (foo: string) => console.info(foo) || foo + 2;

Ссылка на игровую площадку (прочитайте это, чтобы понять declare global, она вам, скорее всего, понадобится, но не на детской площадке).

Это не позволит вообще использовать void в таких логических цепочках, и это, наверное, хорошо: если вы принимаете обратный вызов, возвращающий void, вы можете случайно использовать его в callback() || 'something' и разочароваться, когда этот обратный вызов вернется 1.

function test(callback: () => void) {
    return callback() || 'something'
}
test(() => 1)

«Выражение типа «void» не может быть проверено на истинность» — это единственная ошибка, выдаваемая машинописным текстом для приведенного выше фрагмента, поэтому его отключение действительно может привести к принятию неработающего кода.

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