Description
I wrote this in closed #13536 first, but thought it might get lost there, so filing a new issue.
Merging const
s with namespaces really makes sense. For a real-world example, let's take a popular library: TinyMCE, writing proper type definitions for which requires this feature. Namespaces are really convenient in this case because all the classes from the API are attached to the tinymce
namespace object or to its subnamespaces. In the API, there are normal classes like tinymce.Editor
and so called 'static classes' like tinymce.EditorManager
which are just a type (interface) plus an object value of this type attached to the namespace:
declare namespace tinymce {
// normal class
class Editor {
show(): void;
// ...
}
// "static class"
interface EditorManager {
activeEditor: Editor;
// ...
}
const EditorManager: EditorManager;
// ...
}
Nothing unusual so far, but there is a plot twist. The namespace object tinymce
itself implements the tinymce.EditorManager
interface. It could be easily and beautifully solved by merging a const
with the namespace:
declare const tinymce: tinymce.EditorManager;
declare namespace tinymce {
// ... see the previous snippet
}
But unfortunately this isn't allowed. The error message is: Cannot redeclare block-scoped variable 'tinymce'.