How to run Mocha tests written in TypeScript?

Using the latest version of Mocha and ts-node I was getting an Unexpected token import issue. Using the below settings with ts-mocha worked for me:

tsconfig.json

{
    "files": [
        "src/main.ts"
    ],
    "compilerOptions": {
        "noImplicitAny": true,
        "target": "es2015",
        "types": ["mocha"],
        "module": "commonjs"
    }
}

package.json

"scripts": {
    "mocha": "ts-mocha -p library/tsconfig.json library/test/**/*.ts"
  },

launch.json

{
    "type": "node",
    "request": "launch",
    "name": "Mocha Tests",
    "runtimeArgs": [
        "${workspaceFolder}/node_modules/ts-mocha/bin/ts-mocha",
        "--timeout", "999999",
        "-p",
        "${workspaceFolder}/library/tsconfig.json",
        "${workspaceFolder}/library/test/**/*.ts"
    ],
    "internalConsoleOptions": "openOnSessionStart"
}

and gulp.js just incase you want to use gulp too

const gulp = require('gulp');
const ts = require('gulp-typescript');
const mocha = require('gulp-mocha');

const tsProject = ts.createProject('tsconfig.json');

gulp.task('build', () => tsProject.src()
  .pipe(tsProject())
  .js.pipe(gulp.dest('dist')));

gulp.task('test', () => gulp.src('test/*.spec.ts')
  .pipe(mocha({
    reporter: 'nyan',
    require: ['ts-node/register'],
  })));
/* single command to hook into VS Code */
gulp.task('default', gulp.series('build', 'test'));

Don't use this answer. typescript-require is unmaintained, and ts-node is its replacement. Leaving this answer here for posterity.

Found it. The typescript module is actually like a "main" function; it runs the compiler as soon as the module is loaded. Not very nice design.

I poked at Mocha's acceptance tests, which show how to use a custom compiler for foo files. They wire it up via the require.extensions mechanism. I was halfway through writing a module that just calls tsc on the command line when I realized that somebody must have done this before. So it's very simple:

$ npm install typescript-require --save-dev
$ mocha --compilers ts:typescript-require

For anybody who has tried and had problems with typescript-require you may want to try ts-node.

$ npm install -g ts-node
$ mocha --require ts-node/register src/**/*.spec.ts

It also appears that there has been some ongoing discussion about deprecating typescript-require in favor of ts-node.