microsoft / microsoft/TypeScript
Consider property access a form of type guards
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ả
This is a proposal for using property access as another form of type guards (see #900) to narrow union types. While we're investigating expanding the power of type guards (#1007) this feature would support the natural style that JavaScript programmers have in their code today.
Using property access to narrow union types
var x: string|number;
if (x.length) { // no error even though number lacks a length property
var r = x.charAt(3); // x is of type string inside this block
}
var r2 = x.length || x * x; // no error, x narrowed to number on right hand side, r3 is number
var y: string[]|number[]|string;
if (y.length && y.push) {
// y is string[]|number[] now
var first = y[0]; // first is string|number
if (first.length) {
// first is string in here
} else {
// first is number in here
}
}
We do not expand the situations in which types are narrowed, but we do expand the known type guard patterns to include basic property access. In these narrowing contexts it would be an error to access a property that does not exist in at least one of the constituent types of a union type (as it is today). However, it would now be valid to access a property that exists in at least one, but not all, constituent types. Any such property access will then narrow the type of the operand to only those constituent types in the union which do contain the accessed property. In any other context property access is unchanged.
Invalid property access
var x: string|number;
var r = x.length; // error, not a type guard, normal property access rules apply
if (x.len) { } // error, len does not exist on type string|number
var r3 = !x.len && x.length; // error, len does not exist on type string|number
var r4 = x.length && x.len; // error, len does not exist on type string
Issues/Questions
- Should the language service behave differently in these type guard contexts? Should dotting off a union type in a type guard list all members on all types rather than only those that exist on all of them?
- Need to understand performance implications
I have a sample implementation and tests in a branch here: https://github.com/Microsoft/TypeScript/tree/typeGuardsViaPropertyAccess. There're a couple bugs remaining but examples like the above all work and no existing behavior was changed.
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 branch typeGuardsViaPropertyAccess được liên kết trong issue và xem xét implementation mẫu cùng các test của nó. So sánh các ví dụ và các trường hợp truy cập không hợp lệ trong issue này với hành vi type guard hiện có được thảo luận trong #900 và #1007. Công việc được xem là hoàn tất khi các bug còn lại được giải quyết, các câu hỏi về language service và hiệu năng được xử lý, đồng thời các test cho các quy tắc narrowing được đề xuất được thêm hoặc cập nhật.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- javascript, 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
- 20/100