ITADN

tsc --build false negative through export star facade project

#63579Openjasonkuhrt 创建于 2026-06-23
Needs Investigation
J
jasonkuhrtcommented
# `tsc --build` false negative through `export *` facade project ## TypeScript Version `7.0.1-rc` ## Repro Repo: https://github.com/jasonkuhrt/ts-project-reference-reexport-stale-repro ```sh git clone https://github.com/jasonkuhrt/ts-project-reference-reexport-stale-repro.git cd ts-project-reference-reexport-stale-repro pnpm install pnpm repro ``` Project layout: ```text . ├── source/ │ ├── tsconfig.json # composite project │ └── index.ts # exports Status ├── facade/ │ ├── tsconfig.json # composite project, references ../source │ └── index.ts # re-exports source └── consumer/ ├── tsconfig.json # composite project, references ../facade └── index.ts # imports Status through facade ``` Dependency path: ```text consumer/index.ts -> facade/index.ts -> source/index.ts ``` Relevant source: ```ts // source/index.ts export type Status = "old"; ``` ```ts // facade/index.ts export * from "../source/index"; ``` ```ts // consumer/index.ts import type { Status } from "../facade/index"; export const status: "old" = null as unknown as Status; ``` The only compiler option in each project is `composite: true`. ## Actual Behavior `pnpm repro` first builds with: ```ts // source/index.ts export type Status = "old"; ``` Then it changes the source project to: ```ts export type Status = "new"; ``` The incremental build incorrectly exits `0`. The facade declaration remains textually unchanged: ```ts export * from "../source/index"; ``` The consumer declaration remains stale: ```ts export declare const status: "old"; ``` ## Expected Behavior The incremental build should fail like the clean build does: ```text consumer/index.ts(3,14): error TS2322: Type '"new"' is not assignable to type '"old"'. ``` ## Notes This is not pnpm workspace/package-exports behavior. The repro uses no workspace packages and no package imports. [#46153](https://github.com/microsoft/TypeScript/issues/46153) looks related, but this is a minimal `export *` facade case where the intermediate project emits stable declaration text while its re-exported public API changes.
1 条评论