microsoft / microsoft/TypeScript
Interface with readonly property is assignable to interface with mutable property
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: 2.1.4
Code
interface MutableValue<T> {
value: T;
}
interface ImmutableValue<T> {
readonly value: T;
}
let i: ImmutableValue<string> = { value: "hi" };
i.value = "Excellent, I can't change it"; // compile-time error
let m: MutableValue<string> = i;
m.value = "Oh dear, I can change it";
Expected behavior:
The assignment of i to m would fail, to stop us accidentally allowing value to be modified.
Actual behavior:
The assignment is allowed.
The current behaviour was a deliberate choice so this is a breaking change (or strict flag) feature request rather than a bug report!
The Handbook has this snippet:
let a: number[] = [1, 2, 3, 4];
let ro: ReadonlyArray<number> = a;
ro[0] = 12; // error!
ro.push(5); // error!
ro.length = 100; // error!
a = ro; // error!
It notes that a = ro being an error is helpful. But this happens because ReadonlyArray has no push method, making it incompatible with Array.
My example above seems "morally equivalent" to modelling the input/output flow of values with separate methods:
interface MutableValue<T> {
getValue(): T;
setValue(v: T): void;
}
interface ImmutableValue<T> {
getValue(): T;
}
declare let i: ImmutableValue<string>;
i.setValue("Excellent, I can't change it"); // compile-time error
let m: MutableValue<string> = i;
m.setValue("Oh dear, I can change it");
And sure enough, this stops the assignment of i to m.
Would be great if mutable and readonly properties had the same relationship as if they were modelled by separate get/set methods (which of course they might actually be, via property getter/setters).
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 2.1.4 trong issue này, so sánh khả năng gán của các thuộc tính readonly với các interface getter/setter riêng biệt. Xem lại cuộc thảo luận được liên kết về hành vi hiện tại có chủ đích và xác định các ảnh hưởng đối với khả năng tương thích hoặc strict-mode; hoàn thành khi phép gán được yêu cầu bị từ chối mà không làm hỏng hành vi readonly-array đã được ghi 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
- Ít trao đổi
- Độ rõ ràng
- Khá rõ ràng
- Mức phù hợp với người mới
- 35/100