microsoft / microsoft/TypeScript

Behavior difference: (jsdoc) comment emit inconsistencies on expando functions

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

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

Possible Improvement
主要言語
Go
スター
111k
フォーク
14.3k
平均マージ
2日 4時間
マージ済み PR(30日)
132

説明

Summary as below. Note that the commit emit fix for arrows will be a breaking change from TS 6.

| | tsc + `.js` | tsc + `.ts` | tsgo + `.js` | tsgo + `.ts` |
|----------------------------------|-------------|-------------|--------------|--------------|
| ExpandoFunctionInlineNamedExport | ✅ Comment | ✅ Comment | ✅ Comment | ✅ Comment |
| ExpandoArrowInlineNamedExport | ❌ Comment | ✅ Comment | ❌ Comment | ❌ Comment |
| ExpandoFunctionNamedExport | ✅ Comment | ✅ Comment | ✅ Comment | ✅ Comment |
| ExpandoArrowNamedExport | ✅ Comment | ✅ Comment | ❌ Comment | ❌ Comment |
| ExpandoFunctionDefaultExport | ✅ Comment | ✅ Comment | ✅ Comment | ✅ Comment |
| ExpandoArrowDefaultExport | ✅ Comment | ✅ Comment | ❌ Comment | ❌ Comment |

---

## Steps to reproduce

1. Start a plain new project
- "@typescript/native-preview": "7.0.0-dev.20260612.1",
- "typescript": "6.0.3"
2. Run `npx tsgo --init` to get the default tsconfig. Turn on these flags as well.
- "allowJs": true,
- "checkJs": true,
- "stableTypeOrdering": true,
- "removeComments": false,
3. Add the below files. Run `npx tsc` & `npx tsgo` to see the difference.
- Emitted type output from using `.js` and `.ts` are a bit different as shown above.

src/main.js

```js
/**
* jsdoc description on `ExpandoFunctionInlineNamedExport`
*/
export function ExpandoFunctionInlineNamedExport() { return null; }
ExpandoFunctionInlineNamedExport.args = { num: 3 };

/**
* jsdoc description on `ExpandoArrowInlineNamedExport`
*/
export const ExpandoArrowInlineNamedExport = () => { return null; };
ExpandoArrowInlineNamedExport.args = { num: 3 };

/**
* jsdoc description on `ExpandoFunctionNamedExport`
*/
function ExpandoFunctionNamedExport() { return null; }
ExpandoFunctionNamedExport.args = { num: 3 };

/**
* jsdoc description on `ExpandoArrowNamedExport`
*/
const ExpandoArrowNamedExport = () => { return null; };
ExpandoArrowNamedExport.args = { num: 3 };

export { ExpandoFunctionNamedExport, ExpandoArrowNamedExport };

```

src/ExpandoFunctionDefaultExport.js

```js
/**
* jsdoc description on `ExpandoFunctionDefaultExport`
*/
function ExpandoFunctionDefaultExport() { return null; }
ExpandoFunctionDefaultExport.args = { num: 3 };

export default ExpandoFunctionDefaultExport;
```

src/ExpandoArrowDefaultExport.js

```js
/**
* jsdoc description on `ExpandoArrowDefaultExport`
*/
const ExpandoArrowDefaultExport = () => { return null; };
ExpandoArrowDefaultExport.args = { num: 3 };

export default ExpandoArrowDefaultExport;
```

## Behavior with `typescript@6.0`

Output from using `.js`.

```ts
/**
* jsdoc description on `ExpandoFunctionInlineNamedExport`
*/
export function ExpandoFunctionInlineNamedExport(): null;
export namespace ExpandoFunctionInlineNamedExport {
namespace args {
let num: number;
}
}
export function ExpandoArrowInlineNamedExport(): null;
export namespace ExpandoArrowInlineNamedExport {
export namespace args_1 {
let num_1: number;
export { num_1 as num };
}
export { args_1 as args };
}
/**
* jsdoc description on `ExpandoFunctionNamedExport`
*/
export function ExpandoFunctionNamedExport(): null;
export namespace ExpandoFunctionNamedExport {
export namespace args_2 {
let num_2: number;
export { num_2 as num };
}
export { args_2 as args };
}
/**
* jsdoc description on `ExpandoArrowNamedExport`
*/
export function ExpandoArrowNamedExport(): null;
export namespace ExpandoArrowNamedExport {
export namespace args_3 {
let num_3: number;
export { num_3 as num };
}
export { args_3 as args };
}
//# sourceMappingURL=main.d.ts.map

export default ExpandoFunctionDefaultExport;
/**
* jsdoc description on `ExpandoFunctionDefaultExport`
*/
declare function ExpandoFunctionDefaultExport(): null;
declare namespace ExpandoFunctionDefaultExport {
namespace args {
let num: number;
}
}
//# sourceMappingURL=ExpandoFunctionDefaultExport.d.ts.map

export default ExpandoArrowDefaultExport;
/**
* jsdoc description on `ExpandoArrowDefaultExport`
*/
declare function ExpandoArrowDefaultExport(): null;
declare namespace ExpandoArrowDefaultExport {
namespace args {
let num: number;
}
}
//# sourceMappingURL=ExpandoArrowDefaultExport.d.ts.map
```

## Behavior with `tsgo`

Output from using `.js`.

```ts
/**
* jsdoc description on `ExpandoFunctionInlineNamedExport`
*/
export declare function ExpandoFunctionInlineNamedExport(): null;
export declare namespace ExpandoFunctionInlineNamedExport {
var args: {
num: number;
};
}
export declare function ExpandoArrowInlineNamedExport(): null;
export declare namespace ExpandoArrowInlineNamedExport {
var args: {
num: number;
};
}
/**
* jsdoc description on `ExpandoFunctionNamedExport`
*/
declare function ExpandoFunctionNamedExport(): null;
declare namespace ExpandoFunctionNamedExport {
var args: {
num: number;
};
}
declare function ExpandoArrowNamedExport(): null;
declare namespace ExpandoArrowNamedExport {
var args: {
num: number;
};
}
export { ExpandoFunctionNamedExport, ExpandoArrowNamedExport };
//# sourceMappingURL=main.d.ts.map

/**
* jsdoc description on `ExpandoFunctionDefaultExport`
*/
declare function ExpandoFunctionDefaultExport(): null;
declare namespace ExpandoFunctionDefaultExport {
var args: {
num: number;
};
}
export default ExpandoFunctionDefaultExport;
//# sourceMappingURL=ExpandoFunctionDefaultExport.d.ts.map

declare function ExpandoArrowDefaultExport(): null;
declare namespace ExpandoArrowDefaultExport {
var args: {
num: number;
};
}
export default ExpandoArrowDefaultExport;
//# sourceMappingURL=ExpandoArrowDefaultExport.d.ts.map
```

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

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

はじめの一歩

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

調査の方向性

src/ 配下の4つのソースファイルから始め、allowJs、checkJs、stableTypeOrdering、removeComments を無効にした状態で tsc と tsgo を使って宣言出力を再現します。名前付きエクスポートと default エクスポートについて、function および arrow の expando エクスポートに対する JSDoc の出力を比較します。出力が一貫した、合意済みの動作に従えば完了です。

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

評価

技術スタック
go, javascript, typescript
領域
compilers
issue の種類
バグ
難易度
4/5
見積もり時間
3〜5日
活発さ
静か
明瞭さ
おおむね明確
初心者へのやさしさ
45/100

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

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