microsoft / microsoft/TypeScript
`@deprecated` nested namespace handling is buggy
Chưa có ai nhận issue này.
- 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ả
🔎 Search Terms
deprecated nested namespace
🕗 Version & Regression Information
- This is the behavior in every version I tried
⏯ Playground Link
💻 Code
/** @deprecated */
namespace Foo1.Bar {
export const x = 1;
}
namespace Foo1.Baz {
export const x = 1;
}
Foo1.Bar.x;
Foo1.Baz.x;
namespace Foo2.Baz {
export const x = 1;
}
/** @deprecated */
namespace Foo2.Bar {
export const x = 1;
}
Foo2.Bar.x;
Foo2.Baz.x;
🙁 Actual behavior
Usages of Foo1 are stricken through
But usages of Foo2 are not stricken through
Yet intellisense shows the tag in the hover for Foo2
🙂 Expected behavior
Either both Foo1 and Foo2 should be treated as deprecated, or neither should and instead the Bar in Foo1.Bar and Foo2.Bar should be treated as deprecated.
Additional information about the issue
@typescript-eslint recently released a new lint rule no-deprecated which reports a lint error whenever you use a thing marked with @deprecated.
A user mentioned to us that the rule reports incorrectly in certain cases (https://github.com/typescript-eslint/typescript-eslint/issues/9902).
Specifically in a case like this
https://github.com/DefinitelyTyped/DefinitelyTyped/blob/d1c172bdcfd4508405f4b233e11ccd7d8743f763/types/chrome/index.d.ts#L8553-L8556
We did some investigation and found that things can be pretty ambiguous when nested namespace declarations are marked @deprecated like this and TS itself struggles with it.
It's worth noting that the above behaviour is consistent between nested namespace shorthand (namespace Foo.Bar) and the non-shorthand style
Note you see similar behaviour for many declaration-merged things where TS's handling only makrs something as deprecated if the first definition is marked as deprecated, eg Enums.
But there are also cases where TS gets it right, eg Interfaces
Then there are weird cases like type/value shadowing where I'm not sure if TS is right or wrong -- depends on what you expect I guess.
I would love to see some clarification on what you guys think is the correct behaviour so that we can follow-suit!
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 hai ví dụ TypeScript Playground trong issue và so sánh cách deprecation được phân giải cho Foo1 và Foo2. Xem báo cáo no-deprecated được liên kết của @typescript-eslint và khai báo chrome của DefinitelyTyped để kiểm tra hành vi liên quan. Hoàn tất yêu cầu phải có quyết định rõ ràng, nhất quán về việc namespace bên ngoài hay Bar lồng nhau nên được deprecated.
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ó
- 5/5
- Thời gian dự kiến
- Hơn một tuần
- Mức độ hoạt động
- Đình trệ
- Độ rõ ràng
- Cần làm rõ
- Mức phù hợp với người mới
- 25/100