microsoft / microsoft/TypeScript
`silentNeverType` leak in contextual parameter types coming from anonymous non-aliased object type instantiations
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
silent never type return type inference alias propagating anonymous object
### 🕗 Version & Regression Information
- This is the behavior in every version I tried
### ⏯ Playground Link
https://www.typescriptlang.org/play/?ts=6.0.0-dev.20250827#code/JYOwLgpgTgZghgYwgAgAoB4AqA+ZBvAKGWTAAsIQAuZACgHsQYBXAGxmBZYgBNqaA3OCyYRqmAJTIAvLiYgA1iDoB3EJJnI5ilSADcBAL4ECoSLEQpUAYQYBnMFCYIwdKPiLIQEZcizYaEAAeEAhMLlB8UBC2dCz8orSCwgkS0rj8dMDc6umZ2dQYOPpGBNwhLHBRyIJuqAU2IPaOzq76peWVKMwgzsAMyDB0dACMfjSBfDlo6HjIZfCsYGLIBtjiYm0IdmDIUbaLw9IDQ8M0NFOExFFgTFAgnt5oZ3ux8RceV9GvEPrExAD0-2QAD0APweAziYpQ4xgACeAAcUAB1YBkAAiEAWLDAfiOs3mcEWywMbTKCAqVW6vX6gzoACYxhNaFMMKiMViiTi-GsNsYto0dntFvSjnT6Wd3p8bncHj5UM8vnEIFK-i9lb8-oCQeDiJDoWSOlS5DT7nSAMxMyZpaYAbUwAF1echMJttrtootzWKhubJTbLh6ZfcvPLFTFlarPhH4pqAUCwRCYfrjOTKV0TWA+mahgAWK0sm0YAmc4n4ZAIqB0BEklbO13893CnG5n10XP+jSB663EOPBU0dVvAMfD0xn6j7WJvXJmHtCmdAaZ7PHOgAVgL5yLMzmpZx1HtDrr6xdbsFY8Wa7ba87uG7EGDcqeg6Vw67o6HE7+yCnupWs90IA
### 💻 Code
```ts
interface P {
then: (onfulfilled: (value: T) => unknown) => unknown;
}
interface PConstructor {
new (executor: (resolve: (value: T) => void) => void): P;
}
declare var P: PConstructor;
declare function foo1(x: () => P<{ default: T }>): T;
const result1 = foo1(() => {
return new P((resolve) => {
resolve;
});
});
type WithDefault = { default: T };
declare function foo2(x: () => P>): T;
const result2 = foo2(() => {
return new P((resolve) => {
resolve;
});
});
declare function foo3(x: () => P<[T]>): T;
const result3 = foo3(() => {
return new P((resolve) => {
resolve;
});
});
declare function foo4(x: () => P<{ default: { prop: T } }>): T;
const result4 = foo4(() => {
return new P((resolve) => {
resolve;
});
});
declare function foo5(x: () => P<{ default: [T] }>): T;
const result5 = foo5(() => {
return new P((resolve) => {
resolve;
});
});
```
### 🙁 Actual behavior
Only `foo2` and `foo3` have errors and we can see that their inner `resolve`s reference `never`
### 🙂 Expected behavior
All of those should consistently error and `resolve` should be typed as `(value: unknown) => void`. Specifically, `foo1` and `foo2` are the almost the same signatures but `foo2` is using a type alias in its declaration which changes the inference behavior. This is strong indication of the bug here
### Additional information about the issue
_No response_
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 tái hiện ví dụ Playground và so sánh việc suy luận tham số theo ngữ cảnh từ foo1 đến foo5, đặc biệt là các khởi tạo đối tượng ẩn danh so với kiểu bí danh WithDefault. Theo dõi đường đi suy luận kiểu tạo ra kiểu resolve bên trong; hoàn tất khi cả năm trường hợp đều báo lỗi một cách nhất quán và việc phân giải kiểu được báo cáo là chấp nhận unknown.
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
- 48/100