Reported at https://github.com/microsoft/TypeScript/issues/46011#issuecomment-1748749050 ## Repro steps Run declaration emit on this JS ```js /** @typedef {string} S */ /** @type {any} */ module.exports = ""; ``` ## Expected behavior ```ts declare const _exports: any; export = _exports; declare namespace _exports { export { S }; } type S = string; ``` The declaration file is error-free. ## Actual behavior ```ts declare const _exports: any; export = _exports; export type S = string; ``` The declaration file errors with `An export assignment cannot be used in a module with other exported elements.` ## Additional info Declaration emit works as expected if `module.exports` is assigned to an identifier that doesn’t necessitate the `_exports` temp variable synthesis: ```js /** @typedef {string} S */ /** @type {any} */ const x = ""; module.exports = x; ``` produces: ```ts export = x; /** @typedef {string} S */ /** @type {any} */ declare const x: any; declare namespace x { export { S }; } type S = string; ```