Typescript: Using && with a string produces union type with empty string

Created on 17 Jul 2019  ·  3Comments  ·  Source: microsoft/TypeScript


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'

Playground Link:
https://www.typescriptlang.org/play/?strictNullChecks=false#code/C4TwDgpgBAysBOBLAdgcwKrMQe2VAvFAOQCGRUAPsQEZECwAUIwGYCuyAxsDnqhMHFbNmACgCUALlgIUGLLkpR2AEwjMUEZVADejKPqgdcAZ2BQANthKqthBKwgBuPQfj9W8PAFkSwABYAdPAkyMrYALbiUAD8FlY2UABkicRkUFIqahrKzgwAvkA

Related Issues:
Couldn't find any 🕵🏼‍♂️

Bug

All 3 comments

//Expected : const y: 1
//Actual : const y: 0 | 1
const y = true && 1;

Playground

//Expected : const y: true
//Actual : const y: false|true (boolean)
const y = true && true;

Playground

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...

Was this page helpful?
0 / 5 - 0 ratings