Skip to content

Typescript 4.4 breaking change affect retry #83

Description

@chengB12

This is doc about typescript 4.4 breaking change:
https://devblogs.microsoft.com/typescript/announcing-typescript-4-4/#more-compliant-indirect-calls-for-imported-functions

for this code

import { timeouts} from 'retry'

console.log(timeouts({
    retries: 5,
}))

typescript will compile it to

"use strict";
exports.__esModule = true;
var retry_1 = require("retry");
console.log((0, retry_1.timeouts)({
    retries: 5
}));

note it is (0, retry_1.timeouts)(...)
and it will have different "this" context

and it will throw error:

**\node_modules\retry\lib\retry.js:34
    timeouts.push(this.createTimeout(i, opts));
                       ^

TypeError: this.createTimeout is not a function
    at exports.timeouts (**\node_modules\retry\lib\retry.js:34:24)
    at Object.<anonymous> (**\test-fail.js:7:34)
    at Module._compile (node:internal/modules/cjs/loader:1101:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1153:10)
    at Module.load (node:internal/modules/cjs/loader:981:32)
    at Function.Module._load (node:internal/modules/cjs/loader:822:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
    at node:internal/main/run_main_module:17:47

workaround is use import * as retry from 'retry' instead

Activity

  1. added a commit that references this issue on Feb 17, 2022
  2. leaumar commented on Feb 7, 2023

    @leaumar

    The umpteenth error blocking us from upgrading/migrating things... Guess p-retry is the next tool we're replacing, since it depends on this and it doesn't seem this lib is actively maintained, this issue being open for a year and change.

  3. bybraveHQ commented on Jul 5, 2026

    @bybraveHQ

    Fixed in the maintained fork @bybrave/retry2: timeouts() no longer relies on this (it calls createTimeout directly), so the TypeScript 4.4+ indirect-call form import { timeouts } from '...'; timeouts({...}) works. The fork also bundles the TypeScript types, so you no longer need a separate @types/retry. npm i @bybrave/retry2.

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

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions