I have been struggling with the same issue myself for a while, but I think I have a good idea how to fix this.
First, remove the PI from the casing
I know this is strange, but in my experience, this was the main issue. HDMI through the case was working fine with a desktop monitor, but not with the TV. I removed the PI from the case, and tried again, it worked right away. This is because some covers don't allow the mini HDMI cable to fully attach, and hence giving out a weaker signal through the HDMI cable.
If the first step didn't work, we still have a few options. I would list them here in order, so you can try them gradually.
Increase the outgoing signal
You can do that with the config_hdmi_boost=4 config property in /boot/config.txt, the maximum value that you can set for this option is 11, however, the documentation advises against using such a high power boost unnecessarily.
Force outputting HDMI
By using the property force_hotplug=1. Usually this option is already configured for you under /boot/config.txt. It forces the HDMI output even if the monitor was not detected as HDMI-ready.
Increase HDMI compatibility by running in "safe mode"
By using the option hdmi_safe=1 in /boot/config.txt. This runs the HDMI video output in a 'highly compatible' mode. It also changes the resolution to 640X480, but don't worry, we can change it later.
Manually configure the resolution and output mode
Under the HDMI specification, the monitor can 'negotiate' with the attached device, which resolutions and video modes it supports and which it 'prefers'. This is the so-called edid information. The PI should then be able to choose the correct resolution and mode to be outputted. However, this could be problematic in some cases, and it might be better to 'force' output a resolution and a mode if we already know it.
In short, you need to ssh into the RaspberryPi while it is connected to the monitor/tv, and using the commands tvservice -d /tmp/edid and edidparser /tmp/edid to figure out the preferred resolution and mode. You can then set these values using the properties hdmi_group and hdmi_mode in the /boot/config.txt file. You might also need to set the property hdmi_ignore_edid=0xa5000080 to ignore the edid negotiation. Here's a nice tutorial on how to do this.
Remember, you can always take a look at the documentation to understand better what each of these configuration parameters does