microsoft / microsoft/TypeScript

Assignment to constant variables imported from ES6 modules allowed

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

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

Bug Domain: ES Modules
主要言語
Go
スター
111k
フォーク
14.4k
平均マージ
1日 19時間
マージ済み PR(30日)
117

説明

TypeScript Version:
3.7.5

Search Terms:

  • Assignment to constant variable in imported modules

Code

// originalFunction.js
let originalFunction = () => console.log('Original function executed! 🏁');
export {originalFunction};

// patchFunction.js
import {originalFunction} from "./originalFunction.js";
originalFunction = () => console.log('patched function 💥');

// run.js
import './patchFunction.js';
import {originalFunction} from './originalFunction.js';

originalFunction();

Expected behavior:
After tsc (with "allowJs": true, "target": "es5" or es6, "module": "commonjs") and running node run.js in output folder you should get Uncaught TypeError: Assignment to constant variable. at patchFunction.js:6

Just like you'd get with pure es6 in browser with this html (on same 3 original .js files):

<html >
<head></head>
<body>
<script type="module" src="originalFunction.js"></script>
<script type="module" src="patchFunction.js"></script>
<script type="module" src="run.js"></script>
</body>
</html>

Actual behavior:

Output is patched function 💥 because the code is transpiled in this manner:

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var originalFunction_js_1 = require("./originalFunction.js");
originalFunction_js_1.originalFunction = function () {
    console.log('patched function 💥');
};

Playground Link:

Hard to get it on playground because it requires having separate files on filesystem and actually loading them by browser.

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

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

はじめの一歩

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

調査の方向性

allowJsを有効にし、targetをes5またはes6、moduleをcommonjsに設定して、3つのファイル originalFunction.js、patchFunction.js、run.jsで問題をtscを使って再現します。生成されたpatchFunction.jsを示された出力と比較し、Nodeで実行します。インポートされたバインディングへの代入によって関数が置き換えられるのではなく、期待されるTypeErrorがスローされれば完了です。

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

評価

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

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

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