microsoft / microsoft/TypeScript

Generic should expand in union

Open
#43,585 4 comments 2 reactions 1 assignee View on GitHub

@weswigham is already working on this.

Since Apr 9, 2021.

Needs Investigation Rescheduled
Dominant language
Go
Stars
111k
Forks
14.3k
Avg merge
2d 4h
Merged PRs (30d)
132

Description

Bug Report

🔎 Search Terms

generic expansion, union expansion

🕗 Version & Regression Information
  • This changed between versions 4.1.5 and 4.2.3 (and the new behavior remains in 4.3.0-dev.20210407)
⏯ Playground Link
💻 Code
type Maybe<T> =
    | null
    | T

const isResolved = <T>(maybe: Maybe<T>): maybe is T =>
    maybe !== null;

const map = <T, U>(
    maybe: Maybe<T>,
    mapFn: (value: T) => U,
): Maybe<U> => isResolved(maybe) ? mapFn(maybe) : maybe;

// Using an array in this example because it makes the failure obvious when spreading it,
// but the problematic behavior is not specific to arrays.
declare const foo: Maybe<Maybe<string[]>>;
map(foo, t => [...t]); // t is string[] in 4.1, Maybe<string[]> (and error 2488) in 4.2.
map(foo, (t: string[]) => t); // t is string[] in both 4.1 and 4.2 with the annotation.
🙁 Actual behavior

t in map(foo, t => [...t]); is a Maybe<string[]>.

It seems like when T in Maybe is another Maybe, it's opaque (not expanded).

🙂 Expected behavior

t in map(foo, t => [...t]); is a string[].

It seems like when T in Maybe is another Maybe, it's expanded. For example Maybe<Maybe<string[]>> is expanded to null | (null | string []), then collapsed to null | string[], which is the same as Maybe<string[]>.

It seems like this is the desired behavior, because at runtime, t will indeed only ever be string[].

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.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.