microsoft / microsoft/TypeScript
Wrong inference for defaulted generic in nested call
Chưa có ai nhận issue này.
- Ngôn ngữ chính
- Go
- Star
- 111k
- Fork
- 14.3k
- Merge trung bình
- 2 ngày 4 giờ
- Pull request đã merge (30 ngày)
- 132
Mô tả
### 🔎 Search Terms
nested generic call inline inference contextual typing function calls default type parameter
### 🕗 Version & Regression Information
- I see the same issue from version 4.1.5 to nightly in TypeScript Playground
### ⏯ Playground Link
https://www.typescriptlang.org/play/?ts=6.0.0-dev.20260401#code/CYUwxgNghgTiAEAzArgOzAFwJYHtXwCsctUAeAFXhAA8MRVgBneRjGEgcwBp4BVK2vSYs2nHgDUBdBs1btUHeAF54AclUA+ABStYGAFzxyPIYd49GIAA4B+Q+ICUhgAYASAN7kAvh-E-3vF7OAFCgkLAIKOjYeAJW4BgU2gBuUBDIIIbkTvDu8Bg4AEIgWjTxmCDAWTnJxMDwXsHBZQlaRCRaqgASIBAQOKo8qgDqODAQwKoODgB0BcWdPX04o+OTDvAA9JvwAEZQwE1geKzwAO5YGAAWOMgYAMrWsFAFMMqExKiLvf2DaqsTKbBbbwUHwAB6Nma1HKGC0F2utweTxgLzGs3mJQAREt+gDgFiNiCODgcIdobC2p9vss-iMxoChmppnMiiVuj8cPB8VMtjsSWTgkA
### 💻 Code
```ts
declare function join(start: T, end: U, sep?: V): `${T}${V}${U}`
declare function expect(value: T): { toBe(expected: T): void }
expect(join('Hello', 'World')).toBe('HelloWorld') // bad
const withoutSeparator = join('Hello', 'World')
// ^? const withoutSeparator: "HelloWorld"
expect(withoutSeparator).toBe("HelloWorld") // good
expect(join('Hello', 'World', ' ')).toBe('Hello World') // good
```
### 🙁 Actual behavior
TypeScript does not infer the return types correctly of a nested function call when an optional generic param is omitted, even if a default is provided. When the function call is not nested, it is inferred correctly. It is also inferred correctly when all params are provided.
### 🙂 Expected behavior
I would expect that both of these approaches would compile:
```ts
expect(join('Hello', 'World')).toBe('HelloWorld') // bad
const withoutSeparator = join('Hello', 'World')
expect(withoutSeparator).toBe("HelloWorld") // good
```
### Additional information about the issue
There are very similar issues, such as #54184, #56714, and #62680 but they didn't quite match up to what I'm seeing here, particularly since the reproductions are quite a bit more complex.
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 bằng cách chạy bản tái hiện được liên kết trong TypeScript Playground và so sánh lời gọi lồng nhau với lời gọi độc lập và lời gọi được chỉ định đầy đủ. Đọc các issue liên quan #54184, #56714 và #62680 để nắm được ngữ cảnh suy luận hiện có. Được xem là hoàn thành khi cả hai ví dụ không chỉ định dấu phân cách đều biên dịch với kiểu literal mong đợi, trong khi trường hợp có dấu phân cách được cung cấp vẫn chính xác.
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
- Ít trao đổi
- Độ rõ ràng
- Khá rõ ràng
- Mức phù hợp với người mới
- 45/100