Search code examples
node.jstypescripttsc

exports is not defined when running compiled typescript


I am trying to take my first steps into working with typescript and I've run into an issue when trying to run my application.

I get the error ReferenceError: exports is not defined

the code I have is quite simple:

// --src/changeset.ts
export enum ChangeAction {
  ADD,
  DELETE,
  MODIFY
}

export class Changeset {
  constructor(
    public version: Number,
    public content: String,
    public path: String,
    public action: ChangeAction
  ) {}
}

// --src/index.ts
import { Changeset, ChangeAction } from "./changeset";

const set = new Changeset(0, "Hello world", "/dev/null", ChangeAction.ADD);
set.version = 0;

console.log("Hello World! " + set.version);

// --tsconfig.json
{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "outDir": "build"
  },
  "include": ["src/**/*"]
}

running tsc, it compiles and seems to work without any real issues, however when I try to run it with node build/index.js it crashes with this

build/index.js:2
Object.defineProperty(exports, "__esModule", { value: true });
                      ^

ReferenceError: exports is not defined

It feels like I am missing something quite obvious, but I can't really seem to put my finger on it, so what am I missing?


Solution

  • You appear to have enabled Node's ES modules by setting "type": "module" in your package.json, but your tsconfig tells typescript to emit code compatible with CommonJS.

    Either remove "type": "module", or configure tsconfig to emit code targeting ES modules.