1

I have been trying to write a simple typescript async program. I got it running in standard JS but the compiler turns it into un-executable code when I write it in typescript. How do I run the following code,

import fetch from "node-fetch"

const git_zen = async () => {
    const response:any = await fetch('https://api.github.com/zen');
    const zen:string = await response.text();
    return zen;
};

const myZen:any = git_zen();
myZen.then((zen:any) => {console.log(zen)});

First I install fetch with npm i node-fetch Then even though the documentation states that the types are included the compiler tells me to run npm i --save-dev @types/node , after this I get an error that the in the packages module "type:modules" is not set and finally when it does sometimes compile with tsc zen.ts, I get the following output

"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
var __generator = (this && this.__generator) || function (thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (_) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
};
exports.__esModule = true;
var node_fetch_1 = require("node-fetch");
var git_zen = function () { return __awaiter(void 0, void 0, void 0, function () {
    var response, zen;
    return __generator(this, function (_a) {
        switch (_a.label) {
            case 0: return [4 /*yield*/, (0, node_fetch_1.fetch)('https://api.github.com/zen')];
            case 1:
                response = _a.sent();
                return [4 /*yield*/, response.text()];
            case 2:
                zen = _a.sent();
                return [2 /*return*/, zen];
        }
    });
}); };
var myZen = git_zen();
myZen.then(function (zen) { console.log(zen); });

When I try running this code with node using node zen.js, I get errors like Must use import to load ES Module: /Users/hassankamran/code/proj/node_modules/node-fetch/src/index.js require() of ES modules is not supported etc.

1
  • You have to configure TypeScript in the tsconfig.json. Commented Dec 11, 2021 at 21:28

1 Answer 1

1

@types/node, that's just the types for node itself, and has nothing to do with node-fetch..

You will need to make sure you have some tsconfig.json settings for node.

eg.

{
  "compilerOptions": {
    "moduleResolution": "node",
    "target": "ESNext",
    "module":"CommonJS"
  }
}

After doing both of that, your code should look more like this ->

"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const node_fetch_1 = __importDefault(require("node-fetch"));
const git_zen = async () => {
    const response = await (0, node_fetch_1.default)('https://api.github.com/zen');
    const zen = await response.text();
    return zen;
};
const myZen = git_zen();
myZen.then((zen) => { console.log(zen); });

TS Playground here -> https://www.typescriptlang.org/play?target=99&module=1#code/JYWwDg9gTgLgBAMwKYwMYAtFQiOAiAOwgBMkBaZNdPAWACh7UICBneAc2BgH0AvJAnAC8cAIYsAngVRwAFAEphAPjgBvenE1wmreFCQtIrJAC5RBCcLEB3UV0QoMsgOToYMMCxMB6b6LDAAHScMOgArgBGgUwg3vwEzvIA3BpaOmxw8SZsUMAE7Faitvb6hswsSIEwSAAeMAopdFpw+jBhUILxjQC+jYzl8CASAFoCZhZWIXwCDfRDowRV6DOyWeYSikIqqukQADaVexDsqwLy3clAA

It's also possible these days to run node in ES module mode, in that case you could then remove the commonjs in the module setting.

Sign up to request clarification or add additional context in comments.

1 Comment

Thanks, Your answer sent me in the right direction and I got it working, first I downgraded node-fetch to version 2 by using npm i node-fetch@2 then I configured the compiler with flags similar to the ones you used in the typescript playground and added // @ts-ignore above the import statement. Now it works flawless with npx ts-node zen.ts.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.