microsoft / microsoft/TypeScript
Type Merging between extends and 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
- 2 ngày 4 giờ
- Pull request đã merge (30 ngày)
- 132
Mô tả
TypeScript Version:
1.8.10
Code
interface Foo {
on(type: 'foo', listener: (event: MouseEvent) => boolean): boolean;
on(type: string, listener: (event: Event) => boolean): boolean;
}
interface Bar {
on(type: 'bar', listener: (event: MSGestureEvent) => boolean): boolean;
on(type: string, listener: (event: Event) => boolean): boolean;
}
interface FooBarA extends Foo, Bar {} // Error: not correctly extended
interface FooBarB extends Foo, Bar {
on(type: 'foo', listener: (event: MouseEvent) => boolean): boolean;
on(type: 'bar', listener: (event: MSGestureEvent) => boolean): boolean;
on(type: string, listener: (event: Event) => boolean): boolean;
}
type FooBarC = Foo & Bar;
let foobar: FooBarC;
foobar.on('foo', (event) => { return false; });
Expected behavior:
That FooBarA would work instead of throwing an error.
Actual behavior:
FooBarA complains Interface 'FooBarA' cannot simultaneously extend types 'Foo' and 'Bar'. Named property 'on' of types 'Foo' and 'Bar' are not identical.
While that is true in the strictest sense, the "base" override matches, which means in theory the string literal types could be merged and the error should only occur if there is a conflict between a specific string literal type.
Using the intersection type works perfectly fine and the resulting type mirrors the runtime behaviour. Using the "reimplement all methods" (FooBarB) gets really tedious really quickly when you are trying to do something like model event listeners like the above.
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 1.8.10 trong issue và so sánh cách FooBarA mở rộng Foo và Bar với phép giao Foo & Bar tương đương. Hoàn tất khi các overload tương thích được hợp nhất cho FooBarA, trong khi các overload string-literal cụ thể thực sự xung đột vẫn tạo ra lỗi.
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
- Tính năng
- Độ 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
- 25/100