Incremental builds miss diagnostics after UMD declaration changes

未关闭
#64,967 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

维护者通常 1 天内回复

还没有人认领这个 Issue。

评估

难度
4/5
预计耗时
1-2 天
新手友好度
44/100
Issue 类型
缺陷
描述清晰度
描述清楚
活跃度
活跃
技术栈
go, typescript

调研方向

Start with fileAffectsGlobalScope and the bound GlobalExports check described in the issue, then inspect the proposed fix in PR #64966. Reproduce the stale diagnostic with the four listed files and consecutive tsgo -p . --noLib --pretty false runs; compare with --incremental false. Done means the incremental build reports TS2322 after the declaration changes, with the CLI/watch tests and baselines passing.

由索引模型根据 Issue 内容生成。

描述

Bug Domain: tsc: --incremental
🔎 Search Terms

UMD, export as namespace, incremental, stale diagnostics, affectsGlobalScope

🕗 Version & Regression Information

Reproduced with the Go compiler reporting 7.1.0-beta, built from microsoft/TypeScript commit 3e9236361fa97a9e6c685f4833ac457ae2d8c50a.

The first affected version has not been identified. The latest nightly has not been tested.

⏯ Playground Link

This requires consecutive compiler invocations that reuse .tsbuildinfo; a single Playground compilation does not reproduce it.

💻 Code

Create these four files in a new directory. The minimal library keeps the reproduction independent of installed standard-library files.

tsconfig.json:

{
  "compilerOptions": {
    "strict": true,
    "incremental": true,
    "noEmit": true,
    "types": []
  },
  "include": ["*.ts"]
}

lib.d.ts:

interface Array<T> {}
interface Boolean {}
interface CallableFunction {}
interface Function {}
interface IArguments {}
interface NewableFunction {}
interface Number {}
interface Object {}
interface RegExp {}
interface String {}

umd.d.ts:

export as namespace UmdApi;
export interface Item { value: number }

client.ts:

declare const item: UmdApi.Item;
const checked: number = item.value;
  1. Run the Go compiler from this directory, using an unpatched tsgo binary:

    tsgo -p . --noLib --pretty false
    

    This succeeds and creates tsconfig.tsbuildinfo.

  2. Change only umd.d.ts to:

    export as namespace UmdApi;
    export interface Item { value: string }
    
  3. Repeat the same command, keeping the build-info file:

    tsgo -p . --noLib --pretty false
    
  4. Compare with a compilation that disables incremental reuse:

    tsgo -p . --noLib --pretty false --incremental false
    
🙁 Actual behavior

The second incremental build produces no diagnostics and exits with code 0, even though item.value is now a string and checked requires a number. client.ts has not changed.

Compiling the same files with --incremental false reports the error and exits with code 2:

client.ts(2,7): error TS2322: Type 'string' is not assignable to type 'number'.

A fresh directory containing the same edited inputs, without build-info, produces the same error.

🙂 Expected behavior

The incremental build should report TS2322, matching a fresh compilation of the same inputs.

Additional information about the issue

Proposed fix: https://github.com/microsoft/TypeScript/pull/64966

fileAffectsGlobalScope treats this declaration file as an external module without accounting for the global namespace introduced by export as namespace. As a result, changes to the declaration can leave cached diagnostics for unchanged global consumers intact. The proposed fix checks bound GlobalExports before the external-module early return.

The CLI reproduction above has been verified on the unpatched compiler. The PR's new CLI/watch framework tests and baselines remain pending; they have not been run successfully because required test dependencies are unavailable offline.

主要语言
Go
星标
112k
派生
15.4k
平均合并
2 天 21 小时
30 天内合并 PR
126

环境准备

在 Codespaces 中打开

在浏览器里用你自己的 GitHub 账号启动这个项目的开发容器。

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

microsoft/TypeScript 的其他 Issue

查看 microsoft/TypeScript 的全部 Issue

相似的 Issue

更多 Go Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。