TypeScript: Interface vs Class vs Modules vs Program vs Function
I have made these answers match C# as you've mentioned that in your question, but hopefully the answers are useful to people coming to TypeScript from similar languages too.
Interface
An interface in TypeScript is similar to those you have come across in C#. It is a contract - if one of your classes implements an interface, it promises to have certain properties or methods that the interface documents.
In TypeScript an interface can inherit from another interface in order to extend it and from a class to capture its implementation.
Whenever something seems impossible in TypeScript, you can usually solve it with an interface!
In TypeScript, interfaces have a broad range of uses. They describe a structure, so can be used anywhere you use a type (i.e. not just to implement them in a class, you can use them to type variables, parameters, return values and so on).
Class
This is very similar to the concept of a class in C#. You can inherit from other classes to extend or specialise the behaviour.
Namespace
The newer namespace keyword is used to place a group of code within a limited scope. This is similar to C# namespaces.
Module
Modules are better than namespaces when it comes to TypeScript. A module (previously known as an external module) is a file that is self contained and adds nothing to your global scope. You can load modules into local variables as you need them. Modules provide a good way to organise your code and load parts on demand. When using modules, it is best to avoid using namespaces. Modules are better than namespaces.
Program
A program is a collection of modules, classes. This is essentially the thing you have written using TypeScript.
Function / Method
Classes contain methods, and you can also write stand-alone functions that do not belong to a class.
Declare vs. var
var
creates a new variable. declare
is used to tell TypeScript that the variable has been created elsewhere. If you use declare
, nothing is added to the JavaScript that is generated - it is simply a hint to the compiler.
For example, if you use an external script that defines var externalModule
, you would use declare var externalModule
to hint to the TypeScript compiler that externalModule
has already been set up.