microsoft / microsoft/TypeScript
Show comments from properties referenced via 'keyof T'
まだ誰も着手していません。
- 主要言語
- Go
- スター
- 111k
- フォーク
- 14.3k
- 平均マージ
- 1日 19時間
- マージ済み PR(30日)
- 117
説明
Search Terms
comments, keyof
Suggestion
The goal would be to improve Quick Info using code comments extracted from members via a generic keyof T when used as part of a call expression.
Consider the following two cases:
// old way of writing events (since forever)
interface Evented1 {
/** Handles the 'click' event. */
on(type: "click", listener: (args: ClickEvent) => void): this;
/** Handles the 'mousedown' event. */
on(type: "mousedown", listener: (args: MouseDownEvent) => void): this;
// ...
}
declare const obj1: Evented1;
obj1.on("click", _ => {}); // shows 'Handles the 'click' event in quickinfo when hovering over 'on'.
obj1.on("mousedown", _ => {}); // shows 'Handles the 'mousedown' event in quickinfo when hovering over 'on'.
// new way of events (used in lib.dom, may end up being used in Node at some point)...
interface Evented2EventMap {
/** Handles the 'click' event. */
click: ClickEvent;
/** Handles the 'mousedown' event. */
mousedown: MouseDownEvent;
// ...
}
interface Evented2 {
on<K extends keyof Evented2EventMap>(type: K, listener: (args: Evented2EventMap[K]) => void): this;
}
declare const obj2: Evented2;
obj2.on("click", _ => {}); // no comments when hovering over 'on'.
obj2.on("mousedown", _ => {}); // no comments when hovering over 'on'.
Use Cases
Improving quick-info for event-based methods like on/addListener/addEventListener (i.e. for EventEmitter, EventTarget, etc.) and messaging based methods like send (on message ports, websockets, etc.).
Additionally, we could leverage our new @deprecated JSDoc-tag support to flag calls when a generic argument refers to a member name that has been marked with @deprecated.
Examples
interface RequestMap {
/** @deprecated Misspelled, use `AddItem` instead. */
AddIetm: [AddItemRequest, AddItemResponse];
/** Adds a new item to the collection */
AddItem: [AddItemRequest, AddItemResponse];
}
interface EventMap {
/** Raised whenever an item is added to the collection. **/
CollectionChanged: CollectionChangedEventArgs;
}
interface Service {
/** Sends a request to the service. */
send<K extends keyof RequestMap>(type: K, args: RequestMap[K][0]): Promise<RequestMap[K][1]>;
/** Listens for an event from the service. */
on<K extends keyof EventMap>(type: K, listener: (args: EventMap[K]) => void): this;
}
declare const svc: Service;
Quick Info for send:
service.send("AddItem", { });
(method) Service.send<"AddItem">(type: "AddItem", args: AddItemRequest): Promise<AddItemResponse>Sends a request to the service.
Adds a new item to the collection.
Quick Info for send with deprecation:
service.send("AddIetm", {});
(method) Service.send<"AddIetm">(type: "AddIetm", args: AddItemRequest): Promise<AddItemResponse>Sends a request to the service.
@deprecated - Misspelled, use
AddIteminstead.
Quick Info for on:
service.on("CollectionChanged", args => {});
(method) Service.on<"CollectionChanged">(type: "CollectionChanged", listener: (args: CollectionChangedEventArgs) => void): ServiceListens for an event from the service.
Raised whenever an item is added to the collection.
Checklist
My suggestion meets these guidelines:
- This wouldn't be a breaking change in existing TypeScript/JavaScript code
- This wouldn't change the runtime behavior of existing JavaScript code
- This could be implemented without emitting different JS based on the types of the expressions
- This isn't a runtime feature (e.g. library functionality, non-ECMAScript syntax with JavaScript output, etc.)
- This feature would agree with the rest of TypeScript's Design Goals.
Related Issues
- #31992 - Preserve comments when using Extract<keyof T, string>
- #41165 - 'Documented' Utility Type
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
Issue 内の Quick Info の例から始め、関連する issue #31992 と #41165 を確認してください。keyof T を介して参照されるメンバーのコメントと非推奨情報が、実行時の動作を変更せずに、示されている send および on の呼び出しについて Quick Info に表示されれば、作業は完了です。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- typescript
- 領域
- compilers, developer-experience
- issue の種類
- 機能追加
- 難易度
- 5/5
- 見積もり時間
- 1週間以上
- 活発さ
- 停滞
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 35/100