Incremental builds miss diagnostics after UMD declaration changes

Abierto
#64,967 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
4/5
Tiempo estimado
1-2 días
Aptitud para principiantes
44/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
go, typescript

Línea de trabajo

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.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

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.

Lenguaje dominante
Go
Estrellas
112k
Forks
15.4k
Merge medio
2 d 21 h
PR fusionados (30 d)
126

Preparar el entorno

Abrir en Codespaces

Inicia el contenedor de desarrollo del proyecto en tu navegador, con tu propia cuenta de GitHub.

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de microsoft/TypeScript

Todos los issues de microsoft/TypeScript

Issues similares

Más issues de Go

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.