microsoft / microsoft/TypeScript

Generic Tuple Optional Parameter spread errors with Type instantiation is excessively deep and possibly infinite. ts(2589)

Đang mở
#54,550 1 bình luận 0 reaction 0 người được giao Xem trên GitHub

Chưa có ai nhận issue này.

Domain: Conditional Types Possible Improvement
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

type StringableParameters<TArgs> 
  = TArgs extends [optionalHead?:(infer OptionalArg), ...optionalRest:infer OptionalRest] //optionalHead? <- this question mark is what's causing error
    ? [(OptionalArg|string)?, ...StringableParameters<OptionalRest>] //ts(2589)
    : []

type Test = StringableParameters<[1,2?,3?]>
// type Test = [(string | 1)?, (string | 2)?, (string | 3)?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, any?, ...any[]]

That question mark TArgs extends [optionalHead?:(infer OptionalArg) allowing parameters to be optional is leading to the infinite nesting with ts2589 error. If I remove that question mark - it compiles, but omit the optional parameters of the tuple

type StringableParameters<TArgs> = TArgs extends [optionalHead:(infer OptionalArg), ...optionalRest:infer OptionalRest]
? [(OptionalArg|string), ...StringableParameters<OptionalRest>]
: []
type Test = StringableParameters<[1, 2?, 3?]>

//type Test = [string | 1] - optional parameters omitted
🔎 Search Terms

Type instantiation is excessively deep and possibly infinite. ts(2589)
Generic Tuple extends Optional argument

🕗 Version & Regression Information

Typescript v5, v4.7.4,...

⏯ Playground Link

Playground link with relevant code

💻 Code
type StringableParameters<TArgs> 
  = TArgs extends [optionalHead?:(infer OptionalArg), ...optionalRest:infer OptionalRest] //optionalHead? <- this question mark is what's causing error
    ? [(OptionalArg|string)?, ...StringableParameters<OptionalRest>] //ts(2589)
    : []

type TestOptional = StringableParameters<[1,2?,3?]>
/* type TestOptional = [(string | 1 | undefined)?, (string | 2 | undefined)?, (string | 3 | undefined)?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, 
unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?,
 unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?,
 unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, unknown?, ... 6 more ...?, any?]
*/

type StringableParametersNoOptional<TArgs> 
  = TArgs extends [optionalHead:(infer OptionalArg), ...optionalRest:infer OptionalRest] //optionalHead? <- this question mark is what's causing error
    ? [(OptionalArg|string), ...StringableParametersNoOptional<OptionalRest>] //ts(2589)
    : []

type TestNoOptional = StringableParametersNoOptional<[1,2?,3?]>
//type TestNoOptional = [string | 1]
🙁 Actual behavior

Type instantiation is excessively deep and possibly infinite.(2589) and if I use ts-ignore, the TestOptional type has excessive amount of unknown optional parameters on the tail

🙂 Expected behavior
type TestOptional = [(string | 1 | undefined)?, (string | 2 | undefined)?, (string | 3 | undefined)?]

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.

Hướng nghiên cứu

Bắt đầu với bản tái hiện TypeScript Playground được liên kết và so sánh các kiểu tuple conditional optional và non-optional được nêu trong issue. Điều tra lý do optional spread đệ quy vào quá nhiều tham số unknown; hoàn tất khi tuple optional gồm ba phần tử như mong đợi được tạo ra mà không có ts(2589).

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Đánh giá

Công nghệ
typescript
Lĩnh vực
compilers
Loại issue
Lỗi
Độ khó
4/5
Thời gian dự kiến
3-5 ngày
Mức độ hoạt động
Đình trệ
Độ rõ ràng
Khá rõ ràng
Mức phù hợp với người mới
30/100

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.