microsoft / microsoft/TypeScript

Generic should expand in union

Ouverte
#43,585 4 commentaires 2 réactions 1 personne assignée Voir sur GitHub

@weswigham y travaille déjà.

Depuis le 9/4/2021.

Needs Investigation Rescheduled
Langage dominant
Go
Étoiles
111k
Forks
14.3k
Merge moyen
2 j 4 h
PR mergées (30 j)
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[].

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Évaluation

Cette issue n'a pas encore été évaluée.

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.