mottosson
mottosson

Reputation: 3773

Can't console log in short hand arrow function when using Typescript

When debugging an arrow function in javascript you can write like this:

const sum = (a, b) => console.log(a, b) || a + b;

This will first console log a and b and then return the actual result of the function. But when using Typescript it will complain about console log not being able to be tested for truthiness:

An expression of type 'void' cannot be tested for truthiness

This feels like a valid complaint, but at the same time it's a neat trick to debug arrow functions and I would very much like to not have to add curly braces everywhere I have arrow functions if possible.

Even though the log is only there temporarily, are there any way to get Typescript to accept this pattern without using @ts-ignore?

Upvotes: 4

Views: 952

Answers (4)

Boaz
Boaz

Reputation: 20220

Casting the console.log expression to a boolean should work around this.

For example:

const sum = (a, b) => Boolean(console.log(a, b)) || a + b;

Since the expression returns undefined, casting it to boolean would always be false, ensuring any following expression will be returned.

Upvotes: 4

Cuong C. Nguyen
Cuong C. Nguyen

Reputation: 29

I usually use as below:

const sum = (a, b) => a + b && console.log(a, b);

this is my suggestion. :D

Upvotes: 0

CertainPerformance
CertainPerformance

Reputation: 370809

You could overwrite the console type beforehand. Do it once, and you won't have to modify any of your other calls to console.log:

declare const console = {
    log: (...args: unknown[]) => undefined,
    // etc
};

const sum = (a: number, b: number) => console.log(a, b) || 'foo';
const another = (a: number, b: number) => console.log(a, b) || 'bar';

Upvotes: 1

Krzysztof Krzeszewski
Krzysztof Krzeszewski

Reputation: 6749

Change it to use comma operator:

const logger = (a, b) => (console.log(a, b), a + b);

Upvotes: 5

Related Questions