microsoft / microsoft/TypeScript

`silentNeverType` leak in contextual parameter types coming from anonymous non-aliased object type instantiations

Đang mở
#62,345 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.

Bug Domain: check: Type Inference Help Wanted
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

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 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

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.