microsoft / microsoft/TypeScript

Comparison of union types should error

Open
#41,163 10 comments 1 reaction 0 assignees View on GitHub

Nobody has claimed this yet.

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

Description

TypeScript Version: v4.0.2

Search Terms: union type comparison

Code

function compare(a: number | string, b: number | string): boolean {
  return a < b; // <- Fails to error
}
compare(1, "a");
1 < "a"; // Correctly errors: Operator '<' cannot be applied to types 'number' and 'string'.

This is a simplified example taken from an error found in code review. The function's type signature should really be: function compare<T extends number | string>(a: T, b: T): boolean and I would have expected TypeScript to error for the uncorrected type signature.

Expected behavior:

Typescript should catch the error comparing union types within the function as Flow (v0.136.0) does: flow.org/try example.

Actual behavior:

Typescript does not catch the error for a < b.

Playground Link: example in typescriptlang.org/play.

Related Issues:

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 reported comparison in the TypeScript Playground and compare it with the direct number/string comparison shown in the issue. Trace how the type checker handles relational operators for union operands, then add a regression test asserting the expected diagnostic and verify that valid same-type comparisons still work.

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
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.