microsoft / microsoft/TypeScript

Generic should expand in union

Đang mở
#43,585 4 bình luận 2 reaction 1 người được giao Xem trên GitHub

@weswigham đang làm issue này rồi.

Từ ngày 9/4/2021.

Needs Investigation Rescheduled
Ngôn ngữ chính
Go
Star
111k
Fork
14.4k
Merge trung bình
1 ngày 19 giờ
Pull request đã merge (30 ngày)
117

Mô tả

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

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Đánh giá

Issue này chưa được đánh giá.

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.