microsoft / microsoft/TypeScript
Generic type gets widened in an unexpected way
Đang mở
Chưa có ai nhận issue này.
Bug
Domain: Mapped Types
Help Wanted
- 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
🔎 Search Terms
widen
🕗 Version & Regression Information
4.9.4
⏯ Playground Link
Playground link with relevant code
💻 Code
enum One {
A = 'a',
B = 'b',
C = 'c'
}
const isOneSomethingMap = {
[One.A]: true,
[One.B]: false,
[One.C]: true
} as const satisfies Record<One, boolean>;
type BooleanMapToUnion<T extends Record<string, boolean>> = {
[P in keyof T]: T[P] extends true ? P : never;
}[keyof T];
type SomethingOne = BooleanMapToUnion<typeof isOneSomethingMap>;
const a = <T>(value: T) => value;
const b = <T>(fn: (value: T) => T, v: T): T => fn(v);
const v: SomethingOne = One.A as SomethingOne;
const v2: One.A | One.C = One.A as One.A | One.C;
const r1 = b(a, v); // One and not SomethingOne - not expected
const r2 = a(v); // SomethingOne as expected
const r3 = b(a, v2); // Union as expected
const r4 = b(a, One.A as One.A | One.C); // Works
const r5 = b(a, One.A as SomethingOne); // Still doesn't work...
🙁 Actual behavior
The type gets widened when using BooleanMapToUnion... I guess it is the culprit.
🙂 Expected behavior
Both union and using BooleanMapToUnion should work equally.
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 bản tái hiện TypeScript Playground được liên kết và so sánh các kiểu được suy luận của r1 đến r5. Điều tra cách suy luận generic xử lý SomethingOne từ BooleanMapToUnion so với union tường minh, sau đó xác minh rằng kiểu SomethingOne mong đợi được giữ nguyên cho r1 và r5 mà không thay đổi hành vi của các ví dụ khá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
- Đình trệ
- Độ rõ ràng
- Khá rõ ràng
- Mức phù hợp với người mới
- 35/100