microsoft / microsoft/TypeScript

Utility type to reference JSDoc of another type

オープン
#41,023 コメント 0 件 リアクション 10 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

Awaiting More Feedback Suggestion
主要言語
Go
スター
111k
フォーク
14.4k
平均マージ
1日 19時間
マージ済み PR(30日)
117

説明

Search Terms

type level jsdoc
computed jsdoc
reference jsdoc from other type

Suggestion

Add a utility type Docs<T>, which, given type T = U & Docs<V>, results in a type T with the type of U, but with the JSDoc annotations of V (overriding any U might have). This should also add V's go to definition results to T's (maybe prioritized?).

This could either be implemented as a magic type like ThisType (e.g. type Docs<T> = unknown in lib.d.ts), or as an intrinsic type, as introduced in #40580.

Use Cases

This is useful to preserve context when manipulating types (see example below).

Examples

interface Person {
    id: string;
    /**
     * The date this person was born
     */
    birthDate: Date;
    /**
     * The date this person died; `null` indicates that the person is still alive.
     */
    deathDate: Date | null;
    /**
     * This person's age in milliseconds. Calculated as `deathDate - birthDate`
     * when dead (`deathDate === null`), `currentDate - birthDate` when not.
     */
    age: number;
    name: string;
}

const alice: Person = {
    id: "12345",
    birthDate: new Date(),
    deathDate: null,
    age: 0,
    name: "Alice"
};

alice.deathDate // Hover `deathDate`; we can clearly see what this field means and why it might be null

type Lazy<T> = {
    [K in keyof T & string as `get${Capitalize<K>}`]: () => Promise<T[K]>
    // Proposed syntax:
    // [K in keyof T & string as `get${Capitalize<K>}`]: (() => Promise<T[K]>) & Docs<T[K]>
}

type LazyPerson = Lazy<Person>;

declare const getLazyPerson: (id: string) => LazyPerson;

const bob = getLazyPerson("1111");

bob.getDeathDate // Hover `getDeathDate`; we've lost all information about what this field means. Why could it be null?

Playground Link

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.

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

調査の方向性

lib.d.ts にある提案された Docs<T> 宣言から始め、intrinsic-type アプローチについて issue #40580 を読んでください。型システムと言語サービスが JSDoc と go-to-definition の結果をどのように表現しているかを追跡します。提案された型が V のドキュメントを保持し、例に示されているようにその定義結果を T に追加すれば完了です。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
typescript
領域
compilers
issue の種類
機能追加
難易度
5/5
見積もり時間
1週間以上
活発さ
停滞
明瞭さ
おおむね明確
初心者へのやさしさ
25/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。