microsoft / microsoft/TypeScript
Type parameter not usable as type argument in identical type; union in constraint becomes intersection
Chưa có ai nhận issue này.
- Ngôn ngữ chính
- Go
- Star
- 111k
- Fork
- 14.3k
- Merge trung bình
- 1 ngày 19 giờ
- Pull request đã merge (30 ngày)
- 117
Mô tả
🔎 Search Terms
indexed access, constraints, generic, unions, ts2344
🕗 Version & Regression Information
- This changed between versions 3.3 and 3.5 (likely #30769)
⏯ Playground Link
💻 Code
interface Foo<T extends { x: string }, U extends (T | { x: "a" })['x']> {
z: Foo<T, U> // error!
// ~ Type 'U' does not satisfy the constraint 'T["x"] & "a"'. 🙃
}
🙁 Actual behavior
The U type parameter is rejected as a type argument with a TS2344 error about how it doesn't satisfy the constraint. The constraint seems to have shifted from a union to an intersection, even though it comes from an identical place.
🙂 Expected behavior
The U type parameter should be accepted as a type argument.
Additional information about the issue
Distilled from SO question.
I expect this is a consequence of #30769 as per https://github.com/microsoft/TypeScript/issues/31731#issuecomment-498465358, but it is at least somewhat surprising that this should happen when the types involved are identical. One could rewrite the constraint to U extends T["x"] | "a", of course, but this is distilled from the above SO question which is presumably distilled from some use case. What's happening here, exactly, and is it intended, a design limitation, or a bona fide bug?
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- 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.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Hướng nghiên cứu
Bắt đầu với TypeScript Playground được liên kết và ví dụ tối giản về generic constraint trong issue. Điều tra lý do indexed-access constraint được xử lý như một intersection thay vì union dự kiến, đồng thời xem xét regression được báo cáo giữa các phiên bản 3.3 và 3.5 cũng như issue liên quan #30769. Công việc được xem là hoàn tất khi xác định được đây có phải là hành vi có chủ đích hay đã sửa hành vi để U được chấp nhận mà không có TS2344.
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ó
- 5/5
- Thời gian dự kiến
- Hơn một tuần
- 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
- 35/100