Skip to content

UnhandledPromiseRejection: ts-node-esm does not display type checking results #2085

Description

@jahirvidrio

Search Terms

esm, node 20, UnhandledPromiseRejection

Expected Behavior

I expect to see the type checking errors displayed in the console when using ts-node with esm support, providing information about what went wrong during TypeScript compilation.

Actual Behavior

The console output from ts-node-esm does not include information about type checking errors, making it challenging to identify and resolve issues during development. Additionally, Node.js reports the following error:

[UnhandledPromiseRejection: This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). The promise rejected with the reason "[object Object]".] {
  code: 'ERR_UNHANDLED_REJECTION'
}

I tried using it with ts-node-esm and also with the --loader ts-node/esm option.

If I remove ESM support, everything works correctly, and I can see the type checking report from tsc.

Steps to reproduce the problem

const str: number = 'hello world';

console.log(str);

Minimal reproduction

Just run ts-node with esm support

$ NODE_OPTIONS="--no-warnings=ExperimentalWarning --experimental-loader=ts-node/esm" ts-node main.ts

[UnhandledPromiseRejection: This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). The promise rejected with the reason "[object Object]".] {
  code: 'ERR_UNHANDLED_REJECTION'
}

Specifications

  • ts-node version: 10.9.1
  • node version: 20.9.0
  • TypeScript version: 5.2.2
  • tsconfig.json
{
    "compilerOptions": {
        "target": "es2022",
        "module": "es2022"
    },
    "ts-node": {
        "esm": true,
        "experimentalSpecifierResolution": "node"
    }
}
  • package.json:
{
    "type": "module",
    "scripts": {
        "start": "NODE_OPTIONS=\"--no-warnings=ExperimentalWarning --experimental-loader=ts-node/esm\" ts-node main.ts"
    },
    "devDependencies": {
        "ts-node": "^10.9.1",
        "tslib": "^2.6.2",
        "typescript": "^5.2.2"
    }
}
  • Operating system and version: Linux Debian in docker dev container node:20.9.0-bookworm

Activity

  1. TarSzator commented on Nov 16, 2023

    @TarSzator

    I feel my issue fits into this.

    ts-node v10.9.1

    When I have simple code like

    import http from 'http';

    And I run it via

    node --loader ts-node/esm bin/test.ts

    in Node 20. I get the output

    node:internal/process/esm_loader:40
          internalBinding('errors').triggerUncaughtException(
                                    ^
    [Object: null prototype] {
      [Symbol(nodejs.util.inspect.custom)]: [Function: [nodejs.util.inspect.custom]]
    }
    
    Node.js v20.9.0

    When I execute it in Node 18.18.2 I get the output

    /[...]/node_modules/ts-node/src/index.ts:859
        return new TSError(diagnosticText, diagnosticCodes, diagnostics);
               ^
    TSError: ⨯ Unable to compile TypeScript:
    bin/test.ts:1:1 - error TS6133: 'http' is declared but its value is never read.
    
    1 import http from 'http';
      ~~~~~~~~~~~~~~~~~~~~~~~~
    
        at createTSError
        [...]

    This is of corse an academic example but also applies for way more complex projects

    I tried multiple ways of executing node with ts-node all yield the same result.

  2. jahirvidrio commented on Nov 16, 2023

    @jahirvidrio
    Author

    @TarSzator Your issue is not actually an error; it's a configuration in your tsconfig.json file that instructs the compiler to throw an error when a variable is not used. Simply modify the compilerOptions.noUnusedLocals and compilerOptions.noUnusedParameters properties to false.

  3. TarSzator commented on Nov 17, 2023

    @TarSzator

    @jahirvidrio The issue is not that I see an error. The issue is that I not see it when I use Node v20.

    Meaning that I do not see a proper error message when I use Node v20

  4. cj-christoph-gysin commented on Dec 5, 2023

    @cj-christoph-gysin

    I'm seeing the same issue as @TarSzator. It seems the problem now also exists in node-18.19.0:

    $ node --version
    v18.18.2
    $ NODE_OPTIONS="--no-warnings=ExperimentalWarning --experimental-loader=ts-node/esm" npx ts-node main.ts
    /node_modules/ts-node/src/index.ts:859
        return new TSError(diagnosticText, diagnosticCodes, diagnostics);
               ^
    TSError: ⨯ Unable to compile TypeScript:
    main.ts:1:7 - error TS2322: Type 'string' is not assignable to type 'number'.
    
    $ node --version
    v18.19.0
    $ NODE_OPTIONS="--no-warnings=ExperimentalWarning --experimental-loader=ts-node/esm" npx ts-node main.ts
    [Object: null prototype] {
      [Symbol(nodejs.util.inspect.custom)]: [Function: [nodejs.util.inspect.custom]]
    }
    
    $ node --version
    v20.10.0
    $ NODE_OPTIONS="--no-warnings=ExperimentalWarning --experimental-loader=ts-node/esm" npx ts-node main.ts
    [Object: null prototype] {
      [Symbol(nodejs.util.inspect.custom)]: [Function: [nodejs.util.inspect.custom]]
    }
    
  5. davidthornton commented on Jan 13, 2024

    @davidthornton

    Hello TypeScript team!

    I appear to also be experiencing this with my loader command:

    api-1  | > node --no-warnings --watch --loader ts-node/esm index.ts
    api-1  | 
    api-1  | 
    api-1  | node:internal/process/esm_loader:40
    api-1  |       internalBinding('errors').triggerUncaughtException(
    api-1  |                                 ^
    api-1  | [Object: null prototype] {
    api-1  |   [Symbol(nodejs.util.inspect.custom)]: [Function: [nodejs.util.inspect.custom]]
    api-1  | }
    api-1  | 
    api-1  | Node.js v18.19.0
    api-1  | Failed running 'index.ts'
    

    Any help would be appreciated!

  6. davidthornton commented on Jan 13, 2024

    @davidthornton

    Apologies, team I misinterpreted @cj-christoph-gysin's answer as a confirmation that (all) node 18 minor versions worked and that it was just node 20 -- but didn't know I could simply downgrade from my existing 18.19.0 Docker image to the 18.18.2 image build... Which I can now happily confirm a second time - works!

    I'm not terribly familiar with node/ts/es6 internals but does that mean it's a problem with the ts-node loader, or could it still be a weird minor version node runtime change?

  7. lortonx commented on Aug 29, 2024

    @lortonx

    Bump.
    By the way. Its helped for me, but now if any errors execution of the script does not stops:
    compilerOptions.ts-node.logError=true
    compilerOptions.ts-node.pretty=true

  8. pumpkinlink commented on Jul 23, 2025

    @pumpkinlink

    @lortonx 's workaround completely solved the issue for me, I think maybe both of these flags should default to true.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions