The reason you're getting duplicate identifier errors is because each of your CommonJS modules is viewed as having the same scope by the browser. CommonJS environments like Node implicitly assume that each file has its own scope.

Then, each of the declarations that TypeScript emits are const declarations, but JavaScript errors when it encounters two let or const declarations of the same name.

The Module kind was originally AMD, but I needed to change it to CommonJs because I got the error "define is not defined" at runtime in the browser.

This is because you didn't have an AMD loader (like Require.js) included and configured on your page.

You'll need to use some sort of module loader or bundler to use modules in the browser.

Use System.js if you're using systemjs.

Use Require.js if you're targeting AMD.

Use Webpack or Browserify work if you're using CommonJS.

For System.js and AMD, you'll need a <script> tag and an initial configuration on your page for it to work correctly.

ES6 is the target because I get compiler errors in visual studio when referencing angular2 (since it relies on ES6 objects such as Promise)

You probably don't want to target ES6, since older browsers can't use ES6 constructs, so ES5 is a better choice. However, if you're including a Promise polyfill (like core-js or es6-shim), you can set your lib (or your MSBuild <TypeScriptLib>) to the following: