Why does Typescript use the keyword "export" to make classes and interfaces public?

access-modifiers, module, public, typescript

Solution

The primary reason is that `export` matches the plans for ECMAScript. You could argue that "they should have used "export" instead of "public", but asides from "export/private/protected" being a poorly matched set of access modifiers, I believe there is a subtle difference between the two that explains this.

In TypeScript, marking a class member as `public` or `private` has no effect on the generated JavaScript. It is simply a design / compile time tool that you can use to stop your TypeScript code accessing things it shouldn't.

With the `export` keyword, the JavaScript adds a line to add the exported item to the module. In your example: `here.SomeClass = SomeClass;`.

So conceptually, visibility as controlled by `public` and `private` is just for tooling, whereas the `export` keyword changes the output.

Problem

While dabbling with Typescript I realised my classes within modules (used as namespaces) were not available to other classes unless I wrote the `export` keyword before them, such as: ``` module some.namespace.here { export class SomeClass{..} } ``` So now I can use the above code like this: ``` var someVar = new some.namespace.here.SomeClass(); ``` However I was just wondering why this keyword is used opposed to just using the `public` keyword which is used at method level to signify that a method or property should be externally accessible. So why not just use this same mechanism to make classes and interfaces etc externally visible? This would give resulting code like: ``` module some.namespace.here { public class SomeClass{..} } ```

Original source