microsoft / microsoft/TypeScript
[TS 5.4.0-beta] .d.ts emit adding an inline type import instead of utilising existing import
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Go
- Estrellas
- 111k
- Forks
- 14.4k
- Merge medio
- 1 d 19 h
- PR fusionados (30 d)
- 117
Descripción
🔎 Search Terms
declaration emit inline type import resolution
🕗 Version & Regression Information
- This changed between versions 5.3.3 and 5.4.0-beta
- This changed in PR #56857
⏯ Playground Link
💻 Code
// @declaration
// @showEmit
// @showEmittedFile: app/navigator/widget-factory.d.ts
// @filename: lib/index.d.ts
import * as DefaultExport from "./internal/default_exports";
export { DefaultExport as default };
export * as BaseWindow from "./internal/windows/basewindow.d.ts";
// @filename: lib/internal/default_exports.d.ts
export { default as BaseWindow } from "./windows/basewindow";
// @filename: lib/internal/windows/basewindow.d.ts
interface BaseWindow {}
export interface BaseWindowConstructor {}
declare const BaseWindow: BaseWindowConstructor;
export default BaseWindow;
// @filename: lib-utils/shared-types/widget-config.d.ts
import type UI from "../../lib/index";
export interface WidgetFactory {
instantiator(parentWindow: UI.BaseWindow): void;
}
// @filename: app/navigator/widget-factory.ts
import {WidgetFactory} from "../../lib-utils/shared-types/widget-config";
declare const instantiator: WidgetFactory['instantiator'];
// 5.3: __synthetic_export_lib_1.BaseWindow.default
// 5.4: import("../../lib/internal/default_exports").BaseWindow
export default Object.freeze({
instantiator
});
// Our tools inject this before we pass the file to TS.
import type * as __synthetic_export_lib_1 from "../../lib/index";
🙁 Actual behavior
// app/navigator/widget-factory.d.ts
declare const _default: Readonly<{
instantiator: (parentWindow: import("../../lib/internal/default_exports").BaseWindow) => void;
}>;
export default _default;
import type * as __synthetic_export_lib_1 from "../../lib/index";
🙂 Expected behavior
// app/navigator/widget-factory.d.ts
declare const _default: Readonly<{
instantiator: (parentWindow: __synthetic_export_lib_1.BaseWindow.default) => void;
}>;
export default _default;
import type * as __synthetic_export_lib_1 from "../../lib/index";
Additional information about the issue
More background in previous conversation around this: #38111 and this public blog post: https://www.bloomberg.com/company/stories/10-insights-adopting-typescript-at-scale/
The JavaScript runtime we are using TypeScript on is not based on npm style packages (no node_modules resolution or package.json manifest). For the .d.ts that we publish to be able to work consistently across different versions it's important that the inter-package import paths only resolve to the 'public' files and not internal implementation .d.ts files.
To encourage TypeScript to pick these safer paths when emitting .d.ts we add unused imports to the bottom of each file before passing them to the TS compiler.
In general this is still working in 5.4.0-beta, however during our testing at least 8 packages's .d.ts emit regressed with the beta. The playground above re-creates one of these.
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Comienza con la reproducción en el playground, especialmente con app/navigator/widget-factory.ts, lib-utils/shared-types/widget-config.d.ts y lib/index.d.ts; después, sigue el cambio en la emisión de declaraciones de PR #56857. Está terminado cuando el app/navigator/widget-factory.d.ts emitido reutiliza __synthetic_export_lib_1.BaseWindow.default en lugar de añadir una ruta de importación inline a internal/default_exports.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- typescript
- Área
- compilers
- Tipo de issue
- Error
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 35/100