The below code is a super simplified version of a real world scenario I just ran into. When trying to assign a value only if some other condition is true and otherwise returning undefined, TypeScript produces a strange union type that includes empty string ''.
The linked Playground contains a slightly larger example that gets closer to demonstrating my real world use case.
I would argue that in cases where the compiler can clearly know that something is truthy, it should evaluate to the type of the value on the right hand side of &&, even with strictNullChecks off.
TypeScript Version: 3.5.1 (With strictNullChecks off)
Search Terms: logical and empty string, string && empty
Code
const x = true && 'a'
Expected behavior:
Type of x is 'a'
Actual behavior:
Type of x is '' | 'a'
Related Issues:
Couldn't find any 🕵🏼♂️
//Expected : const y: 1
//Actual : const y: 0 | 1
const y = true && 1;
//Expected : const y: true
//Actual : const y: false|true (boolean)
const y = true && true;
There was another issue about this exact bug that I posted more examples in, but I can't find it now ☹️
Also, with strict null checks on:
declare const foo: any
const x = foo && 1 // 1?
This is pretty dumb to do, but still...