microsoft / microsoft/TypeScript

NaN incorrectly narrows to 0

Open
#36,964 4 comments 4 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Awaiting More Feedback Suggestion
Dominant language
Go
Stars
111k
Forks
14.3k
Avg merge
2d 4h
Merged PRs (30d)
132

Description

TypeScript Version: 3.9.0-dev.20200222

Search Terms: NaN Truthiness Falsy

Code

function bool(): boolean { return false; }
function number(): number { return NaN; }

let a = number();
let b = bool();

const x = a && b; // type = boolean | 0
console.log(x); // prints NaN (which is neither boolean, nor 0)

Expected behavior:
Type of x should be number | boolean.

Since NaN isn't a "unit type" like 0, we can't express NaN without using number.

Actual behavior:
Type of x is 0 | boolean.

Playground Link: playground link

Related Issues:
https://github.com/microsoft/TypeScript/issues/32778 (Incorrectly marked as duplicate?)

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Reproduce the example in the linked TypeScript Playground and compare the inferred type of a && b with the reported runtime value. Read related issue #32778 and trace the compiler's truthiness narrowing for number values; done means NaN is not narrowed to 0, with the expected number | boolean type covered by regression testing.

Written by the indexing model from the issue text.

Assessment

Tech stack
typescript
Domain
compilers
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.